Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО от Тихомирова / Файловая_система 9 лр.doc
Скачиваний:
19
Добавлен:
08.06.2015
Размер:
126.98 Кб
Скачать

Лабораторная работа № 9

Файловая система и файловый ввод-вывод

Цель работы - знакомство с методикой использования функций Win32 для получения информации о логических дисках, томах и файлах и выполнения операций ввода-вывода

  1. Краткие теоретические сведения

    1. Разбиение на разделы

Диск – физическое устройство внешней памяти, например, жесткий диск, дискета или компакт-диск. Магнитные диски делятся на секторы размером 512 байт.

Раздел (partition) набор непрерывных секторов на диске. Адрес начального сектора раздела, размер и другие характеристики раздела хранятся в таблице разделов (схема, принятая в MS DOS) или иной базе управления диском.

Простой том - объект, представляющий секторы одного раздела, которым драйверы файловых систем управляют как единым целым.

Составной том - объект, представляющий секторы нескольких разделов, которым драйверы файловых систем управляют как единым целым.

Windows 2000 вводит концепцию базовых и динамических дисков. Диски, созданные по схеме разбиения на разделы, принятой в MS DOS, в Windows 2000 (и XP), называют базовыми. Динамические диски являются новшеством Windows 2000 и реализуют более гибкую схему разбиения на разделы, чем базовые.

    1. Определение имеющихся логических дисков

Функция 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;