Для третьей группы (процедуры FSplit и функции FExpand) вводятся специальные типы для ведения имен файлов и подкаталогов:

- 361 -

TYPE

ComStr = String [127]; { для командной строки }

PathStr = String [79]; { для полного имени файла }

DirStr = String [67]; { для маршрута на диске }

NameStr = String [8]; { только имя файла }

ExtStr = String [4]; { точка и расширение }

Для работы с процедурами поисков файлов и анализа имен необходимо вводить переменные именно таких типов. Размеры строк в типах соответствуют ограничениям MS-DOS на длину имен и маршрутов.

Для работы с файлами может также пригодиться системная переменная модуля DOS — DosError.

<p>16.4.2. Переменная DosError</p>

Предопределенная переменная 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 -

<p>16.4.3. Процедуры поиска файлов на диске</p>

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 { — ПРИМЕР ВЫЗОВА — }

Перейти на страницу:

Поиск

Похожие книги