Работа с дисками компьютера
Говоря о дисках, первое, что нас может заинтересовать, – сколько на нем осталось свободного места. Для этого в языке Pascal реализована функция:
function DiskFree(Drive: Byte) : Int64;
Функция возвращает количество свободного места на диске в байтах. Параметр Drive требует передачи номера диска. Например, 0 = текущий, 1 = A, 2 = B, 3 = С и т. д. Если метод не в состоянии выяснить размер свободного места на диске, он возвращает –1.
Общий размер диска сообщает метод DiskSize(). Выбор номера диска аналогичен методу DiskFree().
functionDiskSize(Drive: Byte) : Int64;
При работе с дисками неоценимую поддержку программисту оказывает Windows API. Кстати, оба рассмотренных выше метода в тайне от нас пользуются услугами функции Windows API GetDiskFreeSpaceEx(). Преимущество этого метода в том, что он всего за один вызов делает то, с чем DiskFree() и DiskSize() справляются только вдвоем. А именно он возвращает количество свободных байт (FreeBytesAvailable), доступных в данный момент пользователю, и общее количество байт на диске (TotalNumberOfBytes). При этом имя диска передается в привычном виде, например C:\, а не в виде цифры, как в случае функций языка Pascal.
Function GetDiskFreeSpaceEx(Drive : PChar; FreeBytesAvailable, TotalNumberOfBytes,
TotalNumberOfFreeBytes : INT64):Boolean;
Если метод выполнился удачно, он возвратит true. Четвертый параметр функции не используется, и вместо него передавайте указатель в никуда – nil. Еще один весьма полезный метод из обоймы операционной системы Windows расскажет нам о типе диска, подключенного к системе:
Function GetDriveType (Drive : PChar) : Integer;
Метод требует указания всего одного параметра – указателя на строку с именем диска. Результат возвращается в соответствии с табл. 4.7.
Таблица 4.7. Константы типа диска
Значение | Описание |
DRIVE_REMOVABLE DRIVE_FIXED DRIVE_REMOTE DRIVE_CDROM DRIVE_RAMDISK | Невозможно определить тип диска. Корневой каталог отсутствует. Съемный диск. Жесткий диск. Удаленный (сетевой) диск. Привод CD. Диск в оперативной памяти. |
Для закрепления пройденного материала реализуем скромный пример, посвященный изучению состава дисков компьютера.
program ...;
{$APPTYPE CONSOLE}
uses SysUtils, Windows;
const ByteInMb=1048576; // 220, именно столько байт в 1 Мбайт
var Ch : CHAR;
iDriveType : Integer;
sDriveType, sSize, sFree : string;
AllBytes, FreeBytes : INT64;
Begin
forCh:='A' to 'Z' do
Begin
iDriveType:=GetDriveType(PChar(Ch + ':\'));
if iDriveType<=1 then Continue; //если диск не обнаружен, пропускаем шаг
Case iDriveType of
DRIVE_REMOVABLE : sDriveType:='Removable';
DRIVE_FIXED : sDriveType:='Fixed';
DRIVE_REMOTE : sDriveType:='Network';
DRIVE_CDROM : sDriveType:='CD-ROM';
DRIVE_RAMDISK : sDriveType:='RAM'
else sDriveType:='Unknown'
end;
sDriveType:='['+sDriveType+']';
if GetDiskFreeSpaceEx(PChar(Ch + ':\'),FreeBytes,AllBytes,nil)=True then
Begin
sSize:=Format('Size: %d.%d Mb',[AllBytes div ByteInMb,
AllBytes mod ByteInMb]);
sFree:=Format('Free: %d.%d Mb',[FreeBytes div ByteInMb,
FreeBytes mod ByteInMb]);
End
else sSize:=''; sFree:='';
WriteLn(Ch+':\',
sDriveType,
#9, sSize, #9,
sFree);
end;
ReadLn;
End.
Задача рассматриваемой программы – собрать сведения обо всех дисках, установленных на компьютере, выяснить их тип, размер и наличие свободного пространства. Сведения о размерах выводятся не в байтах, а в мегабайтах; для этого осуществляется деление на константу ByteInMb, содержащую количество байт в одном мегабайте (220=1048576). Сведения о диске вашего компьютера пополнит еще одна функция из пакета Windows API:
FunctionGetVolumeInformation(
Drive : PChar; // указатель на строку с именем диска
VolumeNameBuffer : PChar; // буфер, в который будет записано имя тома
VolumeNameSize : DWord; // размер буфера с именем тома
VolumeSerialNumber : DWord; // указатель на серийный номер тома
MaximumComponentLength : DWord; // максимальное число символов
// в имени файла
FileSystemFlags : DWord; // указатель на флаги файловой системы
FileSystemNameBuffer : PChar; // буфер с названием файловой системы
FileSystemNameSize : DWord // размер буфера с названием
// файловой системы
) : Integer;
В первом аргументе требуется указать имя диска (не забыв про двоеточие и слэш), о котором нам хочется получить данные. Во все остальные параметры требуется подставить соответствующие массивы и переменные, в которые функция с радостью вернет результаты анализа диска. Если все сложится успешно, метод вернет любое ненулевое значение.
uses SysUtils, Windows;
var VolumeNameBuffer, FileSystemNameBuffer: array [0..MAX_PATH-1] of Char;
SerNum, MaxLen, NotUsed, VolFlags : DWORD;
Begin
GetVolumeInformation(PChar('C:\'),VolumeNameBuffer,
DWord(Sizeof(VolumeNameBuffer)),
@SerNum,
MaxLen,
VolFlags,
FileSystemNameBuffer,
DWord(SizeOf(FileSystemNameBuffer)));
WriteLn('Drive C:\ information');
WriteLn('Volume label: ', VolumeNameBuffer);
WriteLn('File system: ', FileSystemNameBuffer);
WriteLn('Serial number: ', SerNum);
WriteLn('Maximum length: ', MaxLen);
ReadLn;
End.
В примере осталось нераскрытым содержание параметра FileSystemFlags. Это флаг или комбинация флагов, выявляющая некоторые особенности файловой системы, например такие, как поддержка регистра в названиях файлов, возможность сжатия тома и т. п. Более полную информацию можно получить из справочной системы.
В заключение познакомимся еще с одной функцией Windows API, которая предназначена для смены метки тома:
Function SetVolumeLabel(Drive, VolumeName : PChar):Boolean;
Название тома передается через параметр VolumeName.
Резюме
Порядок работы с файлом, а также перечень и особенности вызова методов определяются типом файла. Различают три типа файлов: текстовый, типизированный и двоичный (нетипизированный). Действия, связанные с чтением и записью данных, называются операциями ввода-вывода. Помимо операций ввода-вывода среда Delphi и операционная система Windows предоставляют методы для управления файлами и каталогами. Например, процедуры и функции, предназначенные для поиска файла, получения информации о файле, для удаления, копирования и перемещения файла.
Дата добавления: 2016-03-15; просмотров: 661;