Процедура GetDir( drive : Byte; VAR S : String ) может определить имя текущего каталога заданного диска. Диск задается его индексом или номером:
0 — текущий диск
1 — диск А:
2 — диск В:
3 — диск С:
и т.д.
Если задать номер диска, отсутствующего в конфигурации ПЭВМ, то возникнет ошибка. После выполнения процедуры переменная S будет содержать полное имя каталога (с указанием буквы диска). Можно использовать GetDir для получения текущей буквы диска:
GetDir( 0, S );
WriteLn( 'Текущий диск-> ', S[1], S[2] );
Возвращаемое в S значение можно потом без изменений использовать в вызовах ChDir и MkDir. Но если надо приписать к нему имя файла, то не забудьте вставить между ними разделитель '\':
GetDir( 1, S );
FullFileName := S + '\' + FileName;
Однако это не лучшее решение задачи, ибо как быть в случае, если
- 261 -
S содержит корневой каталог 'А:\'? Решение может дать процедура FExpand модуля DOS.
Процедура ChDir( S : String ) используется для перехода в какой-либо существующий на диске каталог. Она делает текущим каталог, содержащийся в строке S (точнее, пытается сделать — все зависит от корректности содержимого S). Параметр S может содержать все те же значения, что может принять команда MS-DOS CD (CHDIR). Вот некоторые примеры вызовов:
ChDir('C:\PASCAL\EXE') — задан весь путь;
ChDir('\PASCAL\DOS') — дан путь от корневого каталога;
ChDir('WORK') — переход в подкаталог Work текущего каталога;
ChDir('..') — выход из подкаталога;
ChDir('..\TOOLS') — то же, но с переходом;
ChDir('\') — возврат в корневой каталог;
ChDir('A:') — переход в текущий каталог диска A:
Программа может сама создавать каталоги и подкаталоги, используя процедуру MkDir( S : String ). Параметр S должен содержать корректное имя нового подкаталога и при необходимости путь к нему (маршрут). Если возможно по правилам MS-DOS создать такой каталог, то он будет создан. Перехода в новый каталог при этом не происходит. Примеры обращений к процедуре:
MkDir( 'C:\PASCAL\NEW');
MkDir( 'HOBBY');
MkDir( '..\NEWDIR');
Каталоги можно удалять. Удалить можно любой каталог, если:
1) он совершенно пуст;
2) он не является текущим.
Удаление производится процедурой RmDir( S : String ), где S содержит имя удаляемого каталога. Удаление — процедура, симметричная созданию каталога. Примеры будут аналогичны примерам для процедуры MkDir.
Описанными выше процедурами вовсе не исчерпывается набор средств для работы со структурой дисков. Большое число специальных функций реализовано в модуле DOS и рассматривается в гл. 16.
12.11. Обработка ошибок ввода-вывода
Компилятор Турбо Паскаля позволяет генерировать выполнимый код в двух режимах: с проверкой корректности ввода-вывода и без нее. В среде программирования этот режим включается в меню
- 262 -
Options/Compiler/IO-checking. При включении в программу ключ режима компиляции обозначается как
{$I+} — режим проверки включен;
{$I-} — режим отключен.
По умолчанию, как правило, действует режим $I+. Этот ключ компиляции имеет локальную сферу влияния. Можно многократно включать и выключать режим, вставляя в текст программы конструкции {$I+} и {SI-}, тем самым создавая области с контролем ввода-вывода и без него.
При включенном режиме проверки любая ошибка ввода-вывода будет фатальной: программа прервется, выдав номер ошибки. Возможные номера ошибок ввода-вывода находятся в диапазоне от 2 до 200 ( от 2 до 99 — это коды ошибок DOS, от 100 до 149 — ошибки, диагностируемые самой программой, и от 150 до 200 — критические аппаратные ошибки). Расшифровка кодов ошибок с краткими комментариями приведена в табл. 12.6 в конце этого раздела.
Если отключить режим проверки, то при возникновении ошибки ввода-вывода программа уже не будет прерываться, а продолжит работу со следующего оператора. Результат операции ввода-вывода, вызвавшей ошибку, будет неопределен. При этом код ошибки будет сохранен в предопределенной системной переменной InOutRes. Однако для опроса этого кода лучше пользоваться специальной функцией Турбо Паскаля.
12.11.1. Функция IOResult
Функция IOResult : Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода (см. табл. 12.6). Если же операция ввода-вывода прошла без сбоев, то функция вернет значение 0.
Опросить функцию IOResult можно только один раз после каждой операции ввода или вывода, ибо она обнуляет свое значение при каждом вызове. Обычно это обходится запоминанием значения функции в какой-либо переменной. При режиме компиляции операций ввода и (или) вывода {$I+} функция не имеет смысла.
Возможность управлять режимом обработки ошибок и наличие функции IOResult позволяют писать программы, никогда не дающие сбоев при вводе или выводе данных и при работе с каталогами и файлами.
12.11.2. Примеры обработки ошибок ввода-вывода
Рассмотрим несколько практических примеров (везде далее f — файловая переменная).
- 263 -
1. Обработка отсутствия файла с данными. Если файл отсутствует, то действие процедуры открытия Reset вызовет ошибку (рис. 12.10 ).