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