Ошибки открытия файла
Попытка
открыть файл может завершиться неудачей и вызвать ошибку времени выполнения
программы. Причин неудачи при открытии файлов может быть несколько. Например,
программа попытается открыть файл на гибком диске, который не готов к работе (не
закрыта шторка накопителя, или диск не вставлен в накопитель). Другая причина —
отсутствие открываемого в режиме добавления файла (файла нет — добавлять
некуда).
При запуске
программы из Delphi в случае ошибки во время открытия файла возникает
исключение, и на экране появляется диалоговое окно с сообщением (рис. 7.2).
Рис.
7.2.
Пример сообщения об ошибке открытия файла (программа запущена из Delphi)
Если
программа запускается из Windows, то окно с сообщением об ошибке выглядит иначе
(рис. 7.3).
Рис.
7.3.
Пример сообщения об ошибке открытия файла . (программа запущена из Windows)
Программа
может взять на себя задачу контроля за результатом выполнения инструкции
открытия файла. Сделать это можно, проверив значение функции
IOResult (input-Output Result — результат ввода/вывода). Функция IOResuit
возвращает 0, если операция ввода/вывода завершилась успешно; в противном случае
— код ошибки (не ноль).
Для того
чтобы программа смогла проверить результат выполнения операции ввода/вывода,
нужно разрешить ей это делать. Для этого надо перед инструкцией вызова процедуры
открытия файла поместить директиву компилятору — строку {$I-}, которая запрещает
автоматическую обработку ошибок ввода/вывода. Эта директива сообщает
компилятору, что программа берет на себя контроль ошибок. После инструкции
открытия файла следует поместить директиву {$I+}, восстанавливающую режим
автоматической обработки ошибок ввода/вывода.
На рис. 7.4
приведена блок-схема алгоритма открытия файла для добавления, обеспечивающего
создание файла (и тем самым устраняющего ошибку, возникающую при попытке открыть
несуществующий файл) в случае, если открываемого для добавления файла на диске
еще нет.
Рис.
7.4.
Алгоритм открытия файла с обработкой возможной ошибки
Ниже
приведен фрагмент программы, реализующий приведенный выше алгоритм открытия
файла.
AssignFile(f,filename);
{$I-}
Append(f) // открыть для добавления
{$I+}
if
IOResult<> 0 // ошибка открытия
then
Rewrite(f); // открыть для записи
// здесь открыт существующий или новый файл