Советы пользователям Delphi и C++Builder
f65d50f6

Определение наличия дискеты или компакт-диска в дисководе


Нередко в процессе работы приложения следует произвести запись на дискету или считать данные с компакт-диска. Во избежание возникновения сообщений об ошибке при отсутствии диска или дискеты либо об отсутствии свободного места на диске следует определить, готово ли устройство, и каков объем свободного пространства на нем.

Для получения информации о диске можно использовать функцию Windows API GetVolumeInformation. Эта функция возвращает информацию об имени и метке тома, а также характеристиках его файловой системы.

Для получения информации о наличии свободного места на диске можно использовать функцию GetDiskFreeSpace. Эта функция возвращает информацию о числе свободных кластеров и секторов и размерах сектора и кластера для данного диска. Число свободных байт равно числу свободных кластеров, умноженному на число секторовв кластере и на число байт в секторе.

Создадим простейший пример, определяющий тип устройства, его готовность и количество свободных байт. На форму приложения поместим компонент TDriveComboBox со страницы Win31 и четыре метки.

Рис. 1. Форма приложения для получения информации о дисках

Создадим обработчик события OnChange компонента TDriveComboBox. В случае C++Builder он выглядит следующим образом:

void __fastcall TForm1::DriveComboBox1Change(TObject *Sender) { DWORD VolSN,MaxCompLen,FSFlags, FC,SPC,BPS,NC; char VolName[255],FSName[100]; AnsiString s=UpperCase(DriveComboBox1->Drive)+":\\"; Label1->Caption=s; if (GetVolumeInformation(s.c_str(),VolName,255,&VolSN,&MaxCompLen, &FSFlags,FSName,100)) { Label2->Caption="Имя тома: "+AnsiString(VolName); Label3->Caption="Файловая система: "+AnsiString(FSName); if (GetDiskFreeSpace(s.c_str(), &SPC,&FC,&BPS,&NC)) { Label4->Caption="Свободных байт: "+IntToStr(SPC*FC*BPS); } else { Label4->Caption=""; } } else { Label2->Caption="Диск не готов"; Label3->Caption=""; Label4->Caption=""; } }


В случае Delphi этот же обработчик события выглядит так:
procedure TForm1.DriveComboBox1Change(Sender: TObject); var VolName: array [0..255] of char; FSName : array [0..100] of char; VolSN: PDWORD; MaxCompLen,FSFlags: Cardinal; FC,SPC,BPS,NC:DWORD; s: string; begin VolSN:=nil; s:=UpperCase(DriveComboBox1.Drive)+':\'; Label1.Caption:=s; if (GetVolumeInformation(PChar(s),VolName,255, VolSN, MaxCompLen, FSFlags,FSName,100)) then begin Label2.Caption:='Имя тома: '+AnsiString(VolName); Label3.Caption:='Файловая система: '+AnsiString(FSName) ; if GetDiskFreeSpace(PChar(s),SPC,BPS,FC,NC) then Label4.Caption:='Свободных байт: '+IntToStr(SPC*FC*BPS) else Label4.Caption:='' end else begin Label2.Caption:='Диск не готов'; Label3.Caption:=''; Label4.Caption:='' end; end;
Запустив приложение, мы можем выбирать устройство из списка доступных устройств и получать информацию о готовности устройства, метке тома и числе свободных байт.

Рис. 2. Приложение для вывода информации о дисках на этапе выполнения

Содержание раздела