Борисок Валерий Викторович - Delphi. Трюки и эффекты стр 21.

Книгу можно купить на ЛитРес.
Всего за 49 руб. Купить полную версию
Шрифт
Фон

...

function GetDiskFreeSpaceEx(lpDirectoryName: PChar;

var lpFreeBytesAvailableToCaller,

lpTotalNumberOfBytes;

lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;

Функция принимает путь (любой) файла или папки на интересующем диске и заполняет три параметра:

• lpFreeBytesAvailableToCaller – размер свободного пространства, доступного пользователю, под чьими правами работает поток, вызывающий функцию (в байтах);

• lpTotalNumberOf Bytes – полный размер диска (в байтах);

• lpTotalNumberOf FreeBytes – размер свободного пространства на диске (в байтах).

Все перечисленные значения являются 64-битными, чтобы можно было оперировать размерами дисков более 4 Гбайт. Если вызов функции GetDiskFreeSpaceEx оказывается неудачным, то возвращается значение False. В этом случае функции листинга 4.3 возвращают -1, сигнализируя об ошибке.

Теперь самое интересное – определение детальной информации о файловой системе на дисках. Много интересного о файловой системе на каждом диске можно узнать при помощи API-функции GetVolumelnformation. Она имеет следующий вид:

...

function GetVolumeInformation(lpRootPathName: PChar;

lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD;

lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength,

lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar;

nFileSystemNameSize: DWORD): BOOL;

Объявление функции выглядит довольно громоздким за счет большого количества параметров. Однако использовать функцию GetVolumelnformation очень просто. Чтобы не вдаваться в долгое описание ее параметров, рассмотрим ее использование на примере (листинг 4.4).

...

Листинг 4.4.

Определение информации о диске

//Функция определяет информацию о диске

//Возвращает False, если возникла ошибка

function GetDriveInformation(root: String;

var info: DriveInfo):Boolean;

var

bufDriveName, bufFSNAme: String;

SN: DWORD;

maxFileName, fsOptions: Cardinal;

begin

SetLength(bufDriveName, 101);

SetLength(bufFSName, 101);

//Определение информации о диске

if GetVolumeInformation(PAnsiChar(root),

PAnsiChar(bufDriveName), 100,

Addr(SN), maxFileName, fsOptions,

PAnsiChar(bufFSName), 100) <> False

then

begin

//Заполняем структуру информацией о диске

with info do

begin

DriveLabel := bufDriveName;

FileSystemName := bufFSName;

SerialNumber := SN;

MaxFileNameLen := maxFileName;

//..параметры файловой системы

with info.FileSystemOptions do

begin

CaseSensitive := fsOptions and FS_CASE_SENSITIVE <> 0;

SupportCompression := fsOptions and

FS_FILE_COMPRESSION <> 0;

IsCompressed := fsOptions and FS_VOL_IS_COMPRESSED <> 0;

end;

end;

//Функция отработала успешно

GetDriveInformation := True;

end

else

//Ошибка

GetDriveInformation := False;

end;

Если проанализировать приведенный листинг, то можно увидеть, что функции GetVolumelnf ormation, кроме пути, принадлежащего диску, передается также:

• буфер для метки диска (и длина этого буфера);

• указатель на переменную типа DWORD для записи в нее серийного номера тома диска (присваивается при каждом создании файловой системы, например, после форматирования диска);

• ссылка на переменную типа Cardinal для сохранения в ней максимальной длины компонента пути (имени файла или папки);

• ссылка на переменную типа Cardinal для сохранения в ней набора битовых флагов с некоторыми параметрами файловой системы;

• буфер для названия файловой системы (и его длина).

Как вы могли заметить, результатом работы приведенной в листинге 4.4 функции GetDrivelnf ormation является заполнение структуры (записи) Drivelnf о. Определение этой структуры (а также вложенной в нее структуры, хранящей некоторые извлеченные из битовой маски fsOptions флаги) приводится в листинге 4.5.

...

Листинг 4.5.

Определение записей для хранения информации о диске

Type

//Запись некоторых параметров о файловой системе

FSOptions = record

CaseSensitive: Boolean; //При уравнении путей

//учитывает регистр

SupportCompression: Boolean; //Файловая система

//поддерживает сжатие

IsCompressed: Boolean; //Диск сжат

end;

//Запись, содержащая информацию о диске

DriveInfo = record

DriveLabel: String; //Метка диска

FileSystemName: String; //Файловая система диска

FileSystemOptions: FSOptions; //Параметры файловой системы

SerialNumber: DWORD; //Серийный номер тома

MaxFileNameLen: Cardinal; //Максимальная длина имени

//файла

end;

Напоследок рассмотрим еще одну полезную возможность – определение типа носителя диска при помощи API-функции GetDriveType. Она принимает единственный параметр, задающий корневую папку диска (например, С: \, причем обратный слэш на конце обязателен). Функция GetDriveType возвращает целочисленное значение, идентифицирующее тип диска. Вариант получения текстового описания типов дисков с использованием этой API-функции приведен в листинге 4.6.

...

Листинг 4.6.

Определение типа носителя диска

function GetDriveTypeName(root: String): String;

begin

case GetDriveType(PAnsiChar(root)) of

DRIVE_UNKNOWN: GetDriveTypeName := \'Не определен\

DRIVE_REMOVABLE: GetDriveTypeName := \'Сменный\

DRIVE_FIXED: GetDriveTypeName := \'Фиксированный\

DRIVE_REMOTE: GetDriveTypeName := \'Удаленный (сетевой)\

DRIVE_CDROM: GetDriveTypeName := \'Компакт-диск\

DRIVE_RAMDISK: GetDriveTypeName := \'RAM-диск\

else

GetDriveTypeName := \'\' //Возвращается в случае ошибки

end;

end;

Изменение метки диска

Как вы думаете, сложно ли изменить метку диска? Совсем нет: вся сложность состоит в отыскании нужной функции. В данном случае можно применить API-функцию SetVolumeLabel (листинг 4.7).

...

Листинг 4.7.

Изменение метки диска

function SetDriveLabel(root, newLabel: String): Boolean;

begin

SetDriveLabel :=

SetVolumeLabel(PAnsiChar(root), PAnsiChar(newLabel)) <> False;

end;

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

Программа просмотра свойств дисков

В завершение темы работы с дисками рассмотрим еще небольшой пример, обобщающий сказанное выше. Для этого создадим небольшое приложение, выводящее информацию о любом из дисков компьютера. Приложение должно использовать возможности всех рассмотренных выше функций.

Окно этого приложения приведено на рис. 4.1.

Валерий Борисок, Юрий Корвель и др. - Delphi. Трюки и эффекты

Рис. 4.1. Окно с информацией о дисках

Работа формы, приведенной на рис. 4.1, организована предельно просто. Сначала при создании формы получаем список дисков (а также выделяем первый диск и загружаем информацию о нем) (листинг 4.8).

...

Листинг 4.8.

Составление списка дисков

procedure TForm1.FormCreate(Sender: TObject);

begin

//Загрузка букв дисков

if GetDriveLetters(cboDrives.Items) > 0 then

begin

//Выделим первый диск

cboDrives.ItemIndex := 0;

cboDrivesSelect(self);

end

else

Button1.Enabled := False;

end;

Загрузка информации о дисках происходит при выборе буквы диска в списке (листинг 4.9).

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf epub ios.epub fb3 azw3