Для третьей группы (процедуры FSplit и функции FExpand) вводятся специальные типы для ведения имен файлов и подкаталогов:
- 361 -
TYPE
ComStr = String [127]; { для командной строки }
PathStr = String [79]; { для полного имени файла }
DirStr = String [67]; { для маршрута на диске }
NameStr = String [8]; { только имя файла }
ExtStr = String [4]; { точка и расширение }
Для работы с процедурами поисков файлов и анализа имен необходимо вводить переменные именно таких типов. Размеры строк в типах соответствуют ограничениям MS-DOS на длину имен и маршрутов.
Для работы с файлами может также пригодиться системная переменная модуля DOS — DosError.
16.4.2. Переменная DosError
Предопределенная переменная DosError типа Integer содержит номер ошибки, возвращаемой MS-DOS, при неправильной операции. Эта переменная равна нулю до тех под, пока не произойдет сбой во время работы программы при обращении к функциям DOS. Возможные значения DosError:
0 — нет ошибки;
2 — не найден файл (невозможно связать логический файл с физическим устройством);
3 — путь (маршрут) не найден (неверная адресация файла на диске);
4 — слишком много открытых файлов (больше, чем указано в директиве FILES = ... файла CONFIG.SYS);
5 — доступ закрыт (операция заблокирована средствами DOS, или нарушаются правила работы с именами файлов или каталогов);
6 — неверное ведение файла (редкая ошибка, возникающая при нарушении информации в полях файловых переменных или в системных областях MS-DOS);
8 — не хватает памяти;
10 — несовместная операционная система;
11 — нераспознаваемая разметка (формат) диска;
12 — неверный код доступа к диску (ошибка в поле Mode файловой записи);
18 — искомые файлы исчерпаны (возникает при поиске файлов по шаблонам).
Обычно переменная DosError используется в сопряжении с процедурами FindFirst и FindNext.
- 362 -
16.4.3. Процедуры поиска файлов на диске
16.4.3.1. Процедуры FindFirst(Path : String; Attrib : Word; VAR SR: SearchRec ) и FindNextt(VAR SR : SearchRec ). Эти процедуры предназначены для нахождения файлов на диске и всегда сопряжены между собой. Процедура FindFirst принимает в виде параметров строку с указанием маршрута поиска и имени файла (или шаблона для имен файлов) и числовое значение Attrib, указывающее атрибут искомых файлов. Атрибут может задаваться константами или их суммами. Он показывает, какие именно типы имен надо найти. Вызов процедуры FindFirst при заданных значениях параметров Path и Attrib должен производиться один раз. При этом в переменную SR предопределенного типа SearchRec запишутся параметры первого найденного файла (имя, атрибут, дата и время создания и его длина). Кроме этого, будет подготовлена специальная системная запись в памяти для ее дальнейшего использования процедурой FindNext. Эта процедура всегда должна вызываться после FindFirst (или не вызываться вовсе в противном случае). FindNext просто записывает в переданную ей переменную SR параметры следующего найденного файла, удовлетворяющего значениям Path и Attrib.
Контролером работы обеих процедур является переменная DosError. Она равна нулю, если вызов процедур дал какие-либо реальные результаты. Если же вызов закончился ошибкой (такое будет, если неверно задать запрос, или не существует искомых
| USES DOS; { ПРИМЕР ПОИСКА МЕТКИ ДИСКА }
| { Функция возвращает метку диска. }
| FUNCTION GetVolume( Disk : String ) : String;
| VAR SR : SearchRec;
| BEGIN { Поиск. Имя диска дописывается до шаблона.}
| FindFirst( Disk+'\*.*', VolumeID, SR );
| case DosError of { анализ : }
| 0 : GetVolume = SR.Name; { нашлась }
| 18 : GetVolume = 'NO LABEL' { не нашлась }
| else GetVolume = 'ERROR'#7 { ошибка }
| end {case}
| END;
| BEGIN { ПРИМЕР ВЫЗОВА }
| WriteLn( 'Метка диска С: ', GetVolume( 'С:' ) );
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 16.7
- 363 -
файлов, или их список исчерпался при очередном запросе FindNext), DosError будет хранить ее код. При этом FindFirst может дать коды 2 и 18, a FindNext — только 18.
Ряд примеров (рис. 16.7,16.8,16.9) показывает, как можно использовать описанные процедуры.
| USES DOS; { ПРИМЕР ПРОВЕРКИ СУЩЕСТВОВАНИЯ ФАЙЛА }
| (Функция возвращает True, если файл FileName существует. }
| FUNCTION FileExists( FileName : String ) : Boolean;
| VAR SR : SearchRec;
| BEGIN
| { Поиск происходит только среди файлов. }
| FindFirst(FileName,AnyFile-VolumeID-Directory,SR);
| FileExists := ( DosError = 0 )
| END;
| BEGIN { — ПРИМЕР ВЫЗОВА — }