Программирование для 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, метка тома будет удалена. |