Получение информации о логических дисках, томах и файлах
⇐ ПредыдущаяСтр 7 из 7 При работе с файловой системой первым делом, как правило, необходимо определить конфигурацию системы, т.е. какие диски и каких типов установлены на компьютере. Это можно определить при помощи функции 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
Седьмой и восьмой аргументы работают в связке. Седьмой аргумент – lpFileSystemNameBuffer -является указателем на буфер, в который будет записано название файловой системы, а третий - nFileSystemNameSize - определяет размер этого буфера в байтах. Указатели на возвращаемые значения (lpRootPathName, lpVolumeNameBuffer, lpVolumeSerialNumber и lpFileSystemNameBuffer) должны быть перед вызовом функции инициализированы, например, с помощью процедуры GetMem. Рекомендуется проверять возвращаемое функцией GetVolumeInformation значение. Если функция возвращает FALSE, следует проверить правильность задания входных параметров. Для получения информации о типе диска используется функция GetDriveType:
UINT GetDriveType(LPCTSTR lpRootPathName);
В качестве единственного аргумента используется указатель на корневой каталог диска, тип которого необходимо определить. Возвращаемое функцией значение определяет тип диска (табл. 24).
табл. 24 – Типы дисков
Функция 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 с
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|