| while disk > -1 do begin
| WriteLn( 'Диск '+ch+': -> ОБЪЕМ=', disk:8,
| ' Байт; СВОБОДНО ', DiskFree( i ),' Байт' );
| Inc( i ); ch := Succ( ch ); { следующий диск }
| disk := DiskSize( i ) end; {while}
| END.
Рис. 16.6
Первая строка тела процедуры проверяет количество накопителей на гибких дисках (для применения к ним процедур DiskSize и DiskFree надо быть уверенным, что в дисководы вставлены дискеты и шторки на них задвинуты). Далее цикл While анализирует жесткие и виртуальные диски. Цикл продолжается до первого отсутствующего диска. При этом мы считаем, что первый жесткий диск имеет обозначение C: .
- 356 -
Для того чтобы получить значения размеров в килобайтах, достаточно поделить получаемые цифры на 1024, например:
disk := DiskSize( i ) div 1024
Полученное число будет ближайшим меньшим целым числом K.
Проверка самого факта существования в ПЭВМ дисковода может производиться непосредственным вызовом функции MS-DOS. Пример этого будет рассмотрен в разд. 16.5.3 «Процедура MsDos».
16.4. Работа с каталогами и файлами
Традиционные средства языка Паскаль предоставляют минимальные возможности при работе с внешними файлами. Обычно, это открытие, закрытие, переименование и удаление файла (две последние функции отсутствуют в стандарте языка, но имеются в системной библиотеке Турбо Паскаля). А такие специальные действия, как поиск файлов и работа с их атрибутами, реализованы лишь на уровне функций операционной системы и доступны только с помощью средств ассемблера. Некоторые из таких средств включены в виде процедур и функций в модуль DOS Турбо Паскаля (табл. 16.3).
Таблица 16.3
Процедуры и функции | Назначение |
Поиск файлов (анализ каталогов) | |
FindFirst(Path : String; Attr : Word; VAR SR : SearchRec) | Находит первое подходящее запросу Path имя с заданным атрибутом Attr |
FindNext(VAR SR : SearchRec) | Вызывается после FindFirst для нахождения дальнейших подходящих имен |
FSearch(Path : PathStr; DirList : String) : PathStr | Ищет файл с именем Path в списке каталогов DirList; возвращает полное имя файла |
Анализ атрибутов файлов | |
GetFAttr(VAR f : File; VAR FA : Word) | Считывает атрибут FA файла на диске, связанного с f |
SetFAttr(VAR f : File; FA : Word) | Устанавливает атрибут файлу на диске, связанному с f |
- 357 -
Синтаксический анализ имени | |
Fsplit(Path : PathStr; VAR Dir : DirStr; VAR Name : NameStr; VAR Ext : ExtStr) | Разбивает полное имя файла Path на его составляющие (подстроки): путь Dir, имя Name и расширение Ext |
Fexpand(Path : PathStr) : PathStr | Приписывает к имени файла Path текущий маршрут |
16.4.1. Типы и константы модуля DOS для работы с файлами
Для обеспечения работы процедур первых двух групп в модуле DOS вводятся специальные типы и константы. Так, для ввода атрибутов файла или их анализа определены константы
CONST
ReadOnly = $01; { только для чтения }
Hidden = $02; { скрытый файл }
SysFile = $04; { системный (непереносимый) }
VolumeID = $08; { метка диска }
Directory = $10; { подкаталог }
Archive = $20; { архивный (для BACKUP) }
AnyFile = $3F; { сумма всех предыдущих }
При использовании их можно складывать. Так, имя файла имеет шестнадцать вариантов композиций атрибутов ReadOnly, Hidden, SysFile, Archive; имя подкаталога может быть скрытым и т.п. Не стоит только суммировать что-либо с константой AnyFile, ибо она уже есть сумма всех предыдущих.
Для процедур FindFirst и FindNext введен тип SearchRec:
TYPE
SearchRec = RECORD
Fill : Array[1..21] of Byte; {системное поле }
Attr : Byte; {поле атрибута }
Time : LongInt; {запись времени }
Size : Longlnt; {размер файла }
Name : String[12]; {имя файла }
END;
Поля переменной этого типа содержат информацию по последнему найденному имени файла или подкаталога. Кроме того, предопределены еще две записи для поддержания работы с файлами. Для всех
- 358 -
файлов (типизированных или бестиповых), кроме текстовых, имеется системный тип:
TYPE
FileRec = RECORD
Handle : Word;
Mode : Word;
RecSize : Word;