Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для 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 может вернуть одно из следующих значений:

 Значение

 Описание

 0

 Тип устройства не удалось определить

 1

 Указанный корневой каталог не существует

 DRIVE_REMOVABLE

 Устройство со сменным носителем данных

 DRIVE_FIXED

 Устройство с несменным носителем данных

 DRIVE_REMOTE

 Удаленное (сетевое) устройство

 DRIVE_CDROM

 Устройство чтения CD-ROM

 DRIVE_RAMDISK

 Электронный диск (RAM-диск)

Определение параметров логического устройства

Одним из наиболее интересных параметров логического устройства является размер свободного пространства на нем. Этот параметр вместе с некоторыми другими вы можете определить при помощи функции 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, могут быть установлены следующие флаги:

 Флаг

 Описание

 FS_CASE_IS_PRESERVED

 Система делает различия между заглавными и прописными буквами в именах файлов при записи этих имен на диск

 FS_CASE_SENSITIVE

 Система делает различия между заглавными и прописными буквами

 FS_UNICODE_STORED_ON_DISK

 Система может работать с кодировкой Unicode в именах файлов

 FS_PERSISTENT_ACLS

 Система способна работать со списком контроля доступа к файлам ACL (access-control list). Такая возможность есть в файловой системе NTFS, но отсутствует в файловых системах HPFS и FAT

 FS_FILE_COMPRESSION

 Файловая система способна сжимать (компрессовать) отдельные файлы

 FS_VOL_IS_COMPRESSED

 Для тома используется автоматическая компрессия данных

Изменение метки тома

При необходимости вы можете легко изменить метку тома, вызвав для этого функцию SetVolumeLabel XE "SetVolumeLabel" :


BOOL SetVolumeLabel(
  LPCTSTR lpRootPathName, // адрес пути 
                          // к корневому каталогу тома 
  LPCTSTR lpVolumeName);  // новая метка тома

Если параметр lpVolumeName указать как NULL, метка тома будет удалена.

[Назад] [Содеожание] [Дальше]