Учебное пособие: Файловая система

DWORD GetLogicalDrives(void);

DWORD GetLogicalDriveStrings(nBufferSize, lpszBuffer);

Возвращают информацию о присутствующих в системе томах. Функция GetLogicalDrives возвращает двойное слово, установленные в 1 биты которого соответствуют имеющимся томам. Более интересная функция GetLogicalDriveStrings возвращает список из имен корневых каталогов томов. Имена разделяются между собой символом ‘\0’, а весь список завершается двумя символами ‘\0’.

В документации можно встретить утверждения, что эта функция реализована только в Windows NT, однако это не так — в Windows–95 (по крайней мере в локализованной русской версии 4.0.950a) она тоже определена. Точно ее нет только в Win32s. Сравнительно легко можно написать универсальную функцию, которая будет использовать GetLogicalDriveStrings, либо, при ее отсутствии, эмулировать ее с помощью функции GetLogicalDrives (нечто подобное сделано в приводимом ниже примере 2B).

Другой интересный нюанс этой функции связан с тем, что для получения от нее результата, необходимо использовать буфер неизвестной заранее длины (как и для многих других функций Win32 API, работающих с файлами). Можно, конечно, зарезервировать буфер с большим запасом и надеяться, что он почти никогда не будет заполнен полностью. Лучше, однако, сначала узнать требуемое пространство, выделить его, и только затем получить данные:

DWORD dwSize = GetLogicalDriveStrings(0, NULL); // узнатьдлину

LPTSTR lpszStrings = new TCHAR [ dwSize+1 ]; // +1 = длясимвола ‘\0’

GetLogicalDriveStrings(dwSize, lpszStrings);

for (LPTSTR p = lpszStrings; *p; p += lstrlen(p) + 1) {

// ‘p’ указывает на название конкретного тома}

deletelpszStrings;

Следующая рассматриваемая функция — GetDriveType — возвращает информацию о типе тома. В прежнем Windows API существовал аналог этой функции, который получал вместо имени корневого каталога тома номер логического диска и распознавал несколько меньшее количество типов томов — CD–ROMы и RAM диски отдельно не опознавались.

UINT GetDriveType(lpszRoot);

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

Функция GetVolumeInformation возвращает более подробную информацию о томе. С ее помощью можно узнать метку тома (в Windows API для этих целей часто искали файл типа “метка тома” в корневом каталоге этого тома), серийный номер, задаваемый при форматировании тома, тип файловой системы (NTFS, HPFS, CDFS, FAT), а также максимальную длину имени файла, поддерживаемую томом и некоторые другие сведения.

BOOL GetVolumeInformation(

lpszRoot,

lpszVolume, nVolumeSize,

lpdwSerialNumber, lpdwMaxNameLength, lpdwFlags,

lpszFileSystemName, nFileSystemName);

На практике приходилось видеть, когда функция ошибалась с определением файловой системы для удаленных дисков. Такую ошибку трудно четко повторить, так как возможно большое количество комбинаций из систем, установленных на компьютер с запущенным приложением (Windows 3.x + Win32s, Windows–95, Windows–98, Windows NT) и на компьютер, предоставляющий свои диски в общее пользование (список еще больше — включая системы типа OS/2, Macintosh, Unix и прочее).

Достаточно часто может возникнуть необходимость в проверке свободного пространства и полного размера какого–либо тома. Сделать это можно с помощью функции GetDiskFreeSpace:

BOOLGetDiskFreeSpace(

lpszRoot,

lpdwSectorsPerCluster, lpdwBytesPerSector,

lpdwFreeClusters, lpdwTotalClusters);

Эта функция возвращает информацию о размере кластера данных, размере тома в кластерах и о количестве свободных кластеров. Кластер — минимальный объем пространства используемый при выделении места для хранения данных. Кластера обычно жестко не связаны с физической организацией тома, они представляют собой некоторое логическое объединение одной или нескольких физически выделяемых единиц информации на томе. Так, все пространство тома обычно разбивается на физические сектора (обычно по 512 байт для жестких и гибких дисков и 2048–2192 байт для CD–ROM)

С помощью функции SetVolumeLabel вы можете изменить название тома:

BOOL SetVolumeLabel (lpszRoot, lpszVolume); // нереализованав Win32s!

К-во Просмотров: 527
Бесплатно скачать Учебное пособие: Файловая система