Попытка открыть
файл может завершиться неудачей и вызвать ошибку времени выполнения программы.
Причин неудачи при открытии файлов может быть несколько. Например, программа
попытается открыть файл на гибком диске, который не готов к работе (не закрыта
шторка накопителя, или диск не вставлен в накопитель). Другая причина —
отсутствие открываемого в режиме добавления файла (файла нет — добавлять
некуда).
При запуске
программы из 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); // открыть для записи
// здесь открыт существующий или новый файл