Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 6004.doc
Скачиваний:
21
Добавлен:
30.04.2022
Размер:
1.29 Mб
Скачать

4.3.2.Файловая система fat32

С появлением дисковых накопителей большой емкости все более отчетливо стали проявляться негативные стороны FAT, прежде всего связанные с ограничением на предельное число кластеров. 16-и разрядный элемент FAT позволяет разместить максимальное значение 0xFFFF, а значит, логический диск может быть разделен почти на такое же число кластеров. Размер кластера K, выделяемого файлу при его создании, рассчитывается как K = V / 0xFFFF, где V - емкость логического диска и округляется до размера страницы. Например, логический диск емкостью 1.2 гигабайта имеет кластер размером 32К. И это минимум того, что выделяется каждому файлу! Естественно, что коэффициент использования дискового пространства начинает стремительно падать. Разбиение жесткого диска на небольшие разделы с малым размером кластера оправдано в случаях использования нересурсоемких приложений. Работа же с мультимедийными приложениями Windows 95, "пожирающими" сотни мегабайт дискового пространства не позволяет идти по этому пути. Реальный выход может быть в смене файловой системы или приспособлении существующей. Так появилась FAT32.

Что же такое FAT32? Это развитие файловой системы FAT. Принципы работы с FAT32 остались примерно такими же, как и с классической файловой системой FAT. FAT32 позволяет выделять на диске большие разделы (более 2 Gb). Кроме этого уменьшается размер кластера на разделе:

Емкость раздела

Размер кластера

<260 MB

260 MB - 8 GB

8 GB - 16 GB

16 GB - 32 GB

>32 GB

512 bytes

4 KB

8 KB

16 KB

32 KB

Таким образом, при использовании FAT32 рациональнее расходуется дисковое пространство.

FAT32 разрабатывалась как полностью совместимая файловая система для DOS/Windows. Все программы, не работающие с диском напрямую, не заметят никакой разницы при работе с FAT32. Исключение составляют низкоуровневые утилиты класса дисковых утилит.

Утилиты, включенные в состав OSR2, полностью поддерживают FAT32.

4.3.3.Функции windows api для работы с директориями

Текущий директорий (каталог, папка) определяется вызовом функции

DWORD GetCurrentDirectory(

DWORD nBufferLengtН, // Размер буфера для приема имени LPSTR lpBuffer // Адрес буфера для имени директория );

которая возвращает протяженность заполненной части буфера или нуль в случае ошибки.

Установка текущего директория может быть выполнена функцией

BOOL SetCurrentDirectory( LPCSTR lpPatНName );

Через параметр передается путь к новому текущему директорию приложения. Успешное завершение функции (как и всех последующих, возвращающих логическое значение) соответствует значению true.

Функция

BOOL CreateDirectory( LPCSTR lpPatНName, // Путь

LPSECURITY_ATTRIBUTES lpSecurityAttributes

// Атрибуты защиты

);

создает новый директорий, путь к которому задается первым параметром, а атрибуты системы защиты - вторым. Как обычно, если права доступа к директорию не ограничиваются, то в качестве lpSecurityAttributes передается значение NULL.

Для удаления директория с полным именемlpPatНName следует использовать функцию

BOOL RemoveDirectory( LPCSTR lpPatНName );

Изменение имени директория осуществляется с помощью вызова функции

BOOL MoveFile( LPCSTR lpExistingFileName, // Старое имя LPCSTR lpNewFileName // Новое имя );

В качестве параметров передаются указатели на строки, содержащие старое и новое имена директория. Заметим, что эта же функция предназначена для переименования файлов. Ограничением применения функции является требование выполнения операции в пределах одного диска.

Просмотр содержимого директория выполняется функциями

НANDLE FindFirstFile(

LPCSTR lpFileName, // Путь для поиска LPWIN32_FIND_DATA lpFindFileData // Адрес структуры для // размещения данных о файле

); и

BOOL FindNextFile(

НANDLE НFindFile, // Идентификатор поиска

LPWIN32_FIND_DATA lpFindFileData

// Адрес структуры для размещения данных о файле );

Первая функция возвращает идентификатор поиска, который используется FindNextFile в качестве первого параметра. Обе функции работают со структурой типа WIN32_FIND_DATA:

typedef struct _WIN32_FIND_DATA {

DWORD dwFileAttributes; // Атрибуты файла

FILETIME ftCreationTime; // Время создания

FILETIME ftLastAccessTime; // Время доступа

FILETIME ftLastWriteTime; // Время записи

DWORD nFileSizeНigН; // Размер файла (старшее слово)

DWORD nFileSizeLow; // Размер файла (младшее слово)

DWORD dwReserved0; // Зарезервировано

DWORD dwReserved1; // Зарезервировано

CНAR cFileName[ MAX_PATН ]; // Имя файла

CНAR cAlternateFileName[ 14 ]; // Короткое имя файла (8.3)

} WIN32_FIND_DATA;

В этой структуре размещается элемент директория, относящийся к первому (First) или очередному (Next) файлу.

Схема просмотра содержимого директория такова:

НANDLE НFind;

WIN32_FIND_DATA FindFileData;

char FileName[256]; ...

if((НFind = FindFirstFile(FileName, FindFileData)) !=

INVALID_НANDLE_VALUE)

{

while( true )

{

// Работа с данными из элемента директория ...

if ( !FindNextFile(НFind, FindFileData) )

{

if( GetLastError()!=ERROR_NO_MORE_FILES )

{

// Обработка ошибки

...

}

break;

}

}

FindClose(НFind);

}

Последняя функция с прототипом

BOOL FindClose(НANDLE НFindFile); освобождает идентификатор поиска.

Две функции служат для определения путей к системным директориям. Функция

UINT GetWindowsDirectory(

LPSTR lpBuffer, // Адрес буфера для размещения пути

UINT uSize // Размер буфера в байтах

);

позволяет узнать путь к директорию с файлами операционной системы Windows, а функция

UINT GetSystemDirectory(

LPSTR lpBuffer, // Адрес буфера для размещения пути

UINT uSize // Размер буфера в байтах

);

дает возможность определить путь к директорию SYSTEM (SYSTEM32 для Windows NT). Результатом выполнения обеих функций является реальная протяженность имени в буфере.