- •Файловая система и файловый ввод-вывод
- •Краткие теоретические сведения
- •Разбиение на разделы
- •Определение имеющихся логических дисков
- •1.3 Получение информации о томах
- •Поиск файлов
- •1.5.1 Отложенный (асинхронный) ввод-вывод
- •1.5.2 Контроль ошибок ввода-вывода
- •Методика выполнения
- •Отчет о работе
- •Контрольные вопросы
- •Получение информации об exe-файлах ms Windows
Лабораторная работа № 9
Файловая система и файловый ввод-вывод
Цель работы - знакомство с методикой использования функций Win32 для получения информации о логических дисках, томах и файлах и выполнения операций ввода-вывода
Краткие теоретические сведения
Разбиение на разделы
Диск – физическое устройство внешней памяти, например, жесткий диск, дискета или компакт-диск. Магнитные диски делятся на секторы размером 512 байт.
Раздел (partition) – набор непрерывных секторов на диске. Адрес начального сектора раздела, размер и другие характеристики раздела хранятся в таблице разделов (схема, принятая в MS DOS) или иной базе управления диском.
Простой том - объект, представляющий секторы одного раздела, которым драйверы файловых систем управляют как единым целым.
Составной том - объект, представляющий секторы нескольких разделов, которым драйверы файловых систем управляют как единым целым.
Windows 2000 вводит концепцию базовых и динамических дисков. Диски, созданные по схеме разбиения на разделы, принятой в MS DOS, в Windows 2000 (и XP), называют базовыми. Динамические диски являются новшеством Windows 2000 и реализуют более гибкую схему разбиения на разделы, чем базовые.
Определение имеющихся логических дисков
Функция GetLogicalDrivers () : Dword возвращает 32-х битовое значение, каждый бит которого указывает, существует ли соответствующее логическое устройство. Бит 0 - диск А, бит 1 - диск B ….. бит 25 - диск Z.
1.3 Получение информации о томах
1. Функция GetVolumeInformation возвращает информацию, специфичную для файловой системы, связанной с каталогом, указанным первым параметром функции. Остальные параметры - указатели на буферы и переменные типа Dword.
GetVolumeInformation (
lpRootPathName : Pchar, // имя заданного каталога
lpVolumeNameBuffer : Pchar, // возвращаемое имя тома
nVolumeNameSize : Dword, // максимальный размер имени тома в символах. Должен быть задан при вызове функции
lpVolumeSerialNumber : pDword, // серийный номер тома - возвращаемое значение
lpMaximumComponentLenght : Dword, // максимальное количество символов, допустимое
// в именах файлов и каталогов
lpFileSystemFlags : Dword, // возвращаемая информация о возможностях файловой
// системы
lpFileSystemNameBuffer : pChar, // указатель на буфер с названием файловой системы
nFileSystemNameSize : Dword ); // размер этого буфера в символах. Должен быть задан при вызове функции
Заметьте, что указатели на возвращаемые значения должны быть перед вызовом функции инициализированы (например, с помощью процедуры GetMem ).
Рекомендуется проверять возвращаемое функцией GetVolumeInformation значение. При возврате сообщения об ошибке следует проверить правильность задания входных параметров.
2. Функция GetDriveType возвращает информацию о типе указанного логического тома.
GetDriveType (lpRootPathName : PChar) // аргумент - имя заданного тома
3. Функция GetDiskFreeSpace возвращает статистику о дисковом пространстве на указанном логическом разделе.
GetDiskFreeSpace (
lpRootPathName : Pchar, // имя заданного логического раздела
SectorPerCluster : Dword,
BytesPerSector : Dword,
FreeClusters : Dword,
Clusters : Dword );
4. Функция GetDiskFreeSpaceEx возвращает статистику о дисковом пространстве на указанном логическом разделе большого размера.
GetDiskFreeSpaceEx (
lpRootPathName : Pchar, // имя заданного логического раздела
lpFreeBytesAvailableToCaller,
lpTotalNumberOfBytes, // общее число байт – объем раздела
lpTotalNumberOfFreeBytes : int64 // общее число свободных байтов раздела)
Пример использования функций GetLogicalDrives и GetDriveType для получения списка имен разделов винчестера локального компьютера.
Var
gg : DWORD;
i, m : integer;
Std : string;
Begin
gg := GetLogicalDrives;
ListBox1.Clear;
m := 4;
Std := ‘ABCDEFGHIJKLMN’;
for I := 3 to 14 do
if (m and gg) <> 0 then
begin
if GetDriveType (Pchar (std[i]+’:\’)) =DRIVE_FIXED then
listbox1.Items.add (std[i]);
end;
m := 2 * m;
End;