Программирование для Windows NT© Александр Фролов, Григорий ФроловТом 26, часть 1, М.: Диалог-МИФИ, 1996, 272 стр. Информация о файловой системеВ этом разделе мы кратко опишем функции программного интерфейса Microsoft Windows NT, предназначенные для получения информации о дисковых устройствах и состоянии файловой системы. Определение количества дисковых устройств в системеДля того чтобы определить список установленных в системе логических дисковых устройств, вы можете вызвать функцию GetLogicalDrives XE "GetLogicalDrives" : DWORD GetLogicalDrives(VOID); Эта функция не имеет параметров и возвращает 32-разрядное значение, каждый бит которого отвечает за свое логическое устройство. Самый младший, нулевой бит соответствует устройству с идентификатором A:, бит с номером 1 - устройству с идентификатором A:, и так далее. Если бит установлен, устройство присутствует в системе, если нет - отсутствует. Более развернутую информацию о составе логических дисковых устройств в системе можно получить при помощи функции GetLogicalDriveStrings XE "GetLogicalDriveStrings" :
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // размер буфера
LPTSTR lpBuffer); // адрес буфера для записи
// сведений об устойствах
Если вызвать эту функцию с параметрами nBufferLength и lpBuffer равными, соответственно, 0 и NULL, она вернет размер буфера, необходимый для записи информации о всех логических дисковых устройствах, присутствующих в системе. После этого вы можете вызвать функцию GetLogicalDriveStrings еще раз, заказав предварительно буфер нужного размера и указав функции правильный размер буфера. Функция GetLogicalDriveStrings заполнит буфер текстовыми строками вида: a:\ b:\ c:\ Каждая такая строка закрыта двоичным нулем. Последняя строка будет закрыта двумя двоичными нулями. Определение типа устройстваС помощью функции GetDriveType вы можете определить тип дискового устройства: UINT GetDriveType(LPCTSTR lpRootPathName); В качестве параметра функции GetDriveType нужно передать текстовую строку имени устройства, например, полученную при помощи функции GetLogicalDriveStrings. В зависимости от типа указанного устройства функция GetDriveType может вернуть одно из следующих значений:
Определение параметров логического устройстваОдним из наиболее интересных параметров логического устройства является размер свободного пространства на нем. Этот параметр вместе с некоторыми другими вы можете определить при помощи функции GetDiskFreeSpace XE "GetDiskFreeSpace" :
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // адрес пути к корневому каталогу
LPDWORD lpSectorsPerCluster,// количество секторов в кластере
LPDWORD lpBytesPerSector, // количество байт в секторе
LPDWORD lpNumberOfFreeClusters, // количество свободных
// кластеров
LPDWORD lpTotalNumberOfClusters); // общее количество
// кластеров
Перед вызовом этой функции вы должны подготовить несколько переменных типа DWORD и передать функции их адреса. Функция GetDiskFreeSpace запишет в эти переменные параметры логического диска, перечисленные в комментариях к прототипу функции. Для того чтобы определить размер свободного пространства на диске в байтах, вы должны умножить значение количества свободных кластеров (записанное по адресу lpNumberOfFreeClusters) на количество секторов в кластере (записанное по адресу lpSectorsPerCluster) и на количество байт в одном секторе (которое будет записано по адресу lpBytesPerSector). Более подробно о делении диска на кластеры и секторы вы можете узнать из 19 тома “Библиотеки системного программиста”. В программном интерфейсе Microsoft Windows NT есть еще одна функция, с помощью которой вы можете определить параметры дискового устройства. Это функция GetVolumeInformation XE "GetVolumeInformation" :
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // адрес пути к корневому каталогу
LPTSTR lpVolumeNameBuffer, // буфер для имени тома
DWORD nVolumeNameSize, // размер буфера lpVolumeNameBuffer
LPDWORD lpVolumeSerialNumber, // буфер для серийного номера
// тома
LPDWORD lpMaximumComponentLength, // буфер для максимальной
// длины имени файла, допустимой для данного тома
LPDWORD lpFileSystemFlags, // буфер для системных флагов
LPTSTR lpFileSystemNameBuffer, // буфер для имени
// файловой системы
DWORD nFileSystemNameSize); // размер буфера
// lpFileSystemNameBuffer
Перед использованием этой функции вы должны подготовить несколько буферов и передать функции их адреса. Функция заполнит буферы параметрами устройства, корневой каталог которого задан параметром lpRootPathName. В буфере системных флагов, адрес которого передается функции через параметр lpFileSystemFlags, могут быть установлены следующие флаги:
Изменение метки томаПри необходимости вы можете легко изменить метку тома, вызвав для этого функцию SetVolumeLabel XE "SetVolumeLabel" :
BOOL SetVolumeLabel(
LPCTSTR lpRootPathName, // адрес пути
// к корневому каталогу тома
LPCTSTR lpVolumeName); // новая метка тома
Если параметр lpVolumeName указать как NULL, метка тома будет удалена. |

