
Файловая система и файловый ввод-вывод
Цель работы: знакомство с методикой использования функций Win32 для получения информации о логических дисках, томах и файлах.
Определение имеющихся логических дисков
Функция GetLogicalDrivers () : Dword возвращает 32-х битовое значение, каждый бит которого указывает, существует ли соответствующее логическое устройство. Бит 0 - диск А, бит 1 - диск B ….. бит 25 - диск Z.
Получение информации о томах
1. Функция GetVolumeInformation возвращает информацию, специфичную для файловой системы, связанной с каталогом, указанным первым параметром функции. Остальные параметры - указатели на буферы и переменные типа Dword.
GetVolumeInformation (
lpRootPathName : Pchar, // имя заданного каталога
lpVolumeNameBuffer : Pchar, // возвращаемое имя тома
nVolumeNameSize : Dword, // максимальный размер имени тома в символах. Должен быть задан при вызове функции
lpVolumeSerialNumber : pDword, // серийный номер тома - возвращаемое значение
lpMaximumComponentLenght : Dword, // максимальное количество сисмволов, допустимое
// в именах файлов и каталогов
lpFileSystemFlags : Dword, // возвращаемая информация о возможностях файловой
// системы
lpFileSystemNameBuffer : pChar, // указатель на буфер с названием файловой системы
nFileSystemNameSize : Dword ); // размер этого буфера в символах. Должен быть задан при вызове функции
Заметьте, что указатели на возвращаемые значения должны быть перед вызовом функции инициализированы (например, с помощью процедуры GetMem ).
Рекомендуется проверять возвращаемое функцией GetVolumeInformation значение. При возврате сообщения об ошибке следует проверить правильность задания входных параметров.
2. Функция GetDiskFreeSpace возвращает статистику о дисковом пространстве на указанном томе.
GetDiskFreeSpace (
lpRootPathName : Pchar, // имя заданного тома
SectorPerCluster : Dword,
BytesPerSector : Dword,
FreeClusters : Dword,
Clusters : Dword );
Пример использования функции GetDiskFreeSpace
if(GetDiskFreeSpace(Disk, &SectorsPerCluster, &BytesPerSector, &NumFreeClusters, &TotalClusters))
{
Str="Число секторов в кластере: ( ";
Str+=ltoa(SectorsPerCluster, ch, 10);
Str+=" )";
m_CListSpase.AddString(Str);
Str="Количество байтов в секторе: ( ";
Str+=ltoa(BytesPerSector, ch, 10);
Str+=" )";
m_CListSpase.AddString(Str);
Str="Количество свободных кластеров на диске: ( ";
Str+=ltoa(NumFreeClusters, ch, 10);
Str+=" )";
m_CListSpase.AddString(Str);
Str="Количество кластеров на диске: ( ";
Str+=ltoa(TotalClusters, ch, 10);
Str+=" )";
m_CListSpase.AddString(Str);
Str="Количество мегабайт на диске: ( ";
TotalByte1=BytesPerSector*SectorsPerCluster;
TotalByte2=TotalClusters/1024;
TotalByte3=(TotalByte1*TotalByte2)/1024;
Str+=ltoa(TotalByte3, ch, 10);
Str+=" Mb )";
m_CListSpase.AddString(Str);
Str="Количество свободных мегабайт на диске: ( ";
TotalByte1=BytesPerSector*SectorsPerCluster;
TotalByte2=NumFreeClusters/1024;
TotalByte3=(TotalByte1*TotalByte2)/1024;
Str+=ltoa(TotalByte3, ch, 10);
Str+=" Mb )";
m_CListSpase.AddString(Str);
}
else m_CListSpase.AddString(_T(" Нет носителя в устройстве."));
}