Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Получение информации о логических дисках, томах и файлах




При работе с файловой системой первым делом, как правило, необходимо определить конфигурацию системы, т.е. какие диски и каких типов установлены на компьютере. Это можно определить при помощи функции GetLogicalDrivers:

 

DWORD GetLogicalDrives(VOID)

 

При удачном завершении функция возвращает 32-х битовое значение, каждый бит которого указывает, существует ли соответствующее логическое устройство: бит 0 - диск А, бит 1 - диск B, бит 2 - диск С ….., бит 25 - диск Z. При неудачном завершении функция возвращает ноль.

Для получения информации о томах системы используется функция GetVolumeInformation, которая возвращает информацию, специфичную для файловой системы, связанной с каталогом, указанным первым параметром функции, остальные параметры - указатели на буферы и переменные типа DWORD:

 

BOOL GetVolumeInformation(

LPCTSTR lpRootPathName,

LPTSTR lpVolumeNameBuffer,

DWORD nVolumeNameSize,

LPDWORD lpVolumeSerialNumber,

LPDWORD lpMaximumComponentLength,

LPDWORD lpFileSystemFlags,

LPTSTR lpFileSystemNameBuffer,

DWORD nFileSystemNameSize

);

 

Первый аргумент - lpRootPathName - является указателем на корневой каталог файловой системы, информацию о которой мы хотим получить. Если этот параметр равен NULL, то используется корневой каталог текущего диска.

Второй и третий аргументы работают в связке. Второй аргумент – lpVolumeNameBuffer -является указателем на буфер, в который будет записано имя диска, а третий - nVolumeNameSize - определяет размер этого буфера в байтах.

В четвертом аргументе - lpVolumeSerialNumber – функция возвращает серийный номер тома.

В пятом аргументе - lpMaximumComponentLength – указывается максимальная длина имени файла вместе с путем, которая допускается в данной файловой системе. Для FAT32 и NTFS данное значение равно 255.

В шестом аргументе - lpFileSystemFlags – функция возвращает двойное слово, в котором может быть записана любая комбинация флагов (табл. 23), дающая дополнительную информацию о файловой системе.

табл. 23 – Назначение битов аргумента lpFileSystemFlags

Флаг Значение Назначение
FS_CASE_SENSITIVE 0x00000001 Если этот флаг установлен, то при записи на диск сохраняется регистр букв в имени файла.
FS_CASE_IS_PRESERVED 0x00000002 Если этот флаг установлен, то файловая система поддерживает имена файлов с учетом регистра.
FS_UNICODE_STORED_ON_DISK 0x00000004 Если этот флаг установлен, то файловая система поддерживает хранение на диске имен файлов в Unicode.
FS_PERSISTENT_ACLS 0x00000008 Если этот флаг установлен, то файловая система способна оперировать со списками контроля доступа ACL (только NTFS).
FS_FILE_COMPRESSION 0x00000010 Если этот флаг установлен, то то файловая система поддерживает сжатие томов.
FS_VOL_IS_COMPRESSED 0x00008000 Если этот флаг установлен, то том, о котором запрашивается информация, был сжат.

 

Седьмой и восьмой аргументы работают в связке. Седьмой аргумент – lpFileSystemNameBuffer -является указателем на буфер, в который будет записано название файловой системы, а третий - nFileSystemNameSize - определяет размер этого буфера в байтах.

Указатели на возвращаемые значения (lpRootPathName, lpVolumeNameBuffer, lpVolumeSerialNumber и lpFileSystemNameBuffer) должны быть перед вызовом функции инициализированы, например, с помощью процедуры GetMem.

Рекомендуется проверять возвращаемое функцией GetVolumeInformation значение. Если функция возвращает FALSE, следует проверить правильность задания входных параметров.

Для получения информации о типе диска используется функция GetDriveType:

 

UINT GetDriveType(LPCTSTR lpRootPathName);

 

В качестве единственного аргумента используется указатель на корневой каталог диска, тип которого необходимо определить. Возвращаемое функцией значение определяет тип диска (табл. 24).

 

табл. 24 – Типы дисков

Флаг Значение Назначение
DRIVE_UNKNOWN   Тип устройства определить не удалось.
DRIVE_NO_ROOT_DIR   Корневого каталога не существует.
DRIVE_REMOVABLE   Устройство со сменным носителем (гибкий диск).
DRIVE_FIXED   Устройство с несменным носителем (жесткий диск).
DRIVE_REMOTE   Удаленное устройство (сетевой диск).
DRIVE_CDROM   CDROM.
DRIVE_RAMDISK   RAM-диск.

 

Функция GetDiskFreeSpace возвращает статистику о дисковом пространстве на указанном томе:

 

BOOL GetDiskFreeSpace (

LPCTSTR lpRootPathName,

LPDWORD lpSectorsPerCluster,

LPDWORD lpBytesPerSector,

LPDWORD lpNumberOfFreeClusters,

LPDWORD lpTotalNumberOfClusters

);

 

Первый аргумент - lpRootPathName - является указателем на корневой каталог файловой системы, информацию о которой мы хотим получить. Если этот параметр равен NULL, то используется текущий каталог диска.

Во втором аргументе - lpSectorsPerCluster – функция возвращает число секторов в кластере.

В третьем аргументе - lpBytesPerSector – функция возвращает количество байт в секторе.

В четвертом аргументе - lpNumberOfFreeClusters – функция возвращает количество свободных кластеров на диске.

В пятом аргументе - lpTotalNumberOfClusters – функция возвращает общее количество кластеров на диске.

Выполнение работы

К п.1. После создания нового проекта, можно приступить к разработке приложения, внешний вид основного окна которого приведен на рис. 6.

 

рис. 6 Внешний вид основного окна приложения

К п.2. После размещения на форме компонента TComboBox, создайте обработчик события OnCreate формы и добавьте туда код для формирования списка о дисках и логических томах, присутствующих в системе:

 

procedure TForm1.FormCreate(Sender: TObject);

var mask,LogDrives,i: DWORD;

begin

LogDrives:=GetLogicalDrives;

mask:=1;

i:=0;

repeat

if (mask and LogDrives) <> 0

then ComboBox1.AddItem(chr(ord('A')+i)+':'+'\',nil);

i:=i+1;

mask:=mask shl 1;

until mask = 0;

end;

 

К п.3. Для отображения информации о выбранном в компоненте ComboBox1 диске или логическом томе, вначале разместите на форме компонент StringGrid1.

Для отображения информации о выбранном диске используются возвращаемые параметры функций GetVolumeInformation, GetDiskFreeSpace и GetDriveType. Кроме того, необходимо определить производные параметры такие как: количество занятых кластеров на диске, и количество свободной, занятой и общей памяти подсчитанной в байтах. Поэтому в раздел public класса TForm1 добавьте следующие переменные:

 

TForm1 = class(TForm)

……………

// компоненты формы

 

private

{ Private declarations }

public

{ Public declarations }

SectorsPerClaster,BytesPerSector,FreeClasters,Clusters: DWORD;

Free,Busy,All: Int64;

MaxCompLength,FileSystemFlags: DWORD;

RootPathName,VolNameBuf,FileSystemNameBuf: PChar;

VolSerialNumber: PDWORD;

end;

 

Теперь добавьте в ранее созданный обработчик события OnCreate формы код для вывода названий параметров диска в соответствии с описаниями тех же функций:

 

procedure TForm1.FormCreate(Sender: TObject);

var mask,LogDrives,i: DWORD;

begin

……………

// определение имеющихся в системе дисков

……………

for i:=0 to high(InfoDrive) do

StringGrid1.Cells[0,i]:=InfoDrive[i]; // массив строк

// параметров

GetMem(VolNameBuf,255);

GetMem(VolSerialNumber,255);

GetMem(FileSystemNameBuf,255);

end;

 

Здесь же выделяется динамическая память (функция GetMem) для хранения строк имен тома, серийного номера тома и имени файловой системы.

Для обновления информации в таблице параметров после выбора нового диска необходимо создать обработчик события OnChange компонента Combobox1, в котором и будет осуществляться запрос информации о выбранном диске:

 

procedure TForm1.ComboBox1Select(Sender: TObject);

var sDriveType: string;

BytesPerClaster: Int64;

begin

RootPathName:=PChar(ComboBox1.Items.Strings[ComboBox1.ItemIndex]);

if GetVolumeInformation(RootPathName,VolNameBuf,255,

VolSerialNumber,MaxCompLength,FileSystemFlags,

FileSystemNameBuf,255) then begin

StringGrid1.Cells[1,0]:=RootPathName;

StringGrid1.Cells[1,1]:=VolNameBuf;

StringGrid1.Cells[1,2]:=IntToHex(DWORD(VolSerialNumber^),8);

StringGrid1.Cells[1,3]:=IntToStr(MaxCompLength);

StringGrid1.Cells[1,4]:=IntToHex(FileSystemFlags,8);

StringGrid1.Cells[1,5]:=FileSystemNameBuf;

endж

if GetDiskFreeSpace(RootPathName,SectorsPerClaster,

BytesPerSector,FreeClasters,Clusters) then begin

StringGrid1.Cells[1,6]:=IntToStr(SectorsPerClaster);

StringGrid1.Cells[1,7]:=IntToStr(BytesPerSector);

StringGrid1.Cells[1,8]:=IntToStr(FreeClasters);

StringGrid1.Cells[1,9]:=IntToStr(Clusters-FreeClasters);

StringGrid1.Cells[1,10]:=IntToStr(Clusters);

end

BytesPerClaster:=SectorsPerClaster*BytesPerSector;

All:=BytesPerClaster*Clusters;

Free:=BytesPerClaster*FreeClasters;

Busy:=All-Free;

StringGrid1.Cells[1,11]:=IntToStr(Free);

StringGrid1.Cells[1,12]:=IntToStr(Busy);

StringGrid1.Cells[1,13]:=IntToStr(All);

StringGrid1.Cells[1,14]:=TypeDrive[GetDriveType(RootPathName)];

 

end;

 

При выходе из программы необходимо освободить память, выделенную под буферы строк:

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

FreeMem(VolNameBuf,255);

FreeMem(VolSerialNumber,255);

FreeMem(FileSystemNameBuf,255);

end;

 

 

Контрольные вопросы

1. Файловая система FAT12.

2. Файловая система FAT16.

3. Файловая система FAT32.

4. Файловая система NTFS.

5. Файловая система CDFS.

6. Cредства Win32 API и Delphi для получения информации о логических дисках, томах и файлах;

7. Cредства Win32 API и Delphi для работы с логическими дисками, томами и файлами.

Библиографический список

 

1. Древс Ю.Г. Организация ЭВМ и вычислительных систем: Учебник для вузов. –М.: Высшая школа. 2006. -501 с.

2.Олифер В.Г., Олифер Н.А. Сетевые операционные системы. Учебник для вузов. 2-е издание. – СПб.: Питер. 2008. 669 с.

3. Буза М.К. Архитектура компьютеров. Минск: Новое знание. 2007. -558 с.

4. Гордеев А.В. Операционные системы: Учебник для вузов. 2-е издание. –СПб.: Питер, 2007. 416 с.

5.Степанов А.Н. Архитектура вычислительных систем и компьютерных сетей. Учебное пособие. С-П. Питер, 2006, 512 с





Поделиться с друзьями:


Дата добавления: 2016-11-24; Мы поможем в написании ваших работ!; просмотров: 482 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Если вы думаете, что на что-то способны, вы правы; если думаете, что у вас ничего не получится - вы тоже правы. © Генри Форд
==> читать все изречения...

2282 - | 2212 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.