Временами при работе с файлами в языке Delphi попытка открыть файл завершается неудачным образом и вызывает ошибку времени выполнения данной программы. Причинами ошибки открытия файлов Delphi могут быть следующие факторы.
К примеру, программа пытается открыть файл, расположенный на гибком диске, которой еще не готов к работе (не закрыт механизм дискового накопителя, либо диск отсутствует в накопителе).
Второй причиной может быть ситуация, когда открываемый в режиме добавления файл отсутствует (то есть, нет файла – и потому добавлять некуда). В процессе запуска программы из Delphi при возникновении ошибки в момент открытия файла появляется исключение, и на дисплее ПК высвечивается специальное диалоговое окно с сообщением об ошибке открытия файла:

Если запуск программы проводится из системы Windows, то внешний вид окна с сообщением, сигнализирующем о возникновении ошибки при открытии файла, представится следующим образом

Для того, чтобы программа самостоятельно контролировала результат исполнения операции открытия файла, нужно провести проверку значения функции IOResult (что означает результат ввода/вывода: Input-Output – ввод-вывод, а Result — результат). Функция IOResult принимает значение 0 в случае успешного завершения операции ввода/вывода, иначе возникает код ошибки (не 0).
Для обеспечения возможности проверки программой результата выполнения инструкций ввода/вывода следует разрешить программе это делать. Поэтому перед инструкцией, осуществляющей вызов процедуры открытия файла, необходимо указать директиву компилятору – строку {$I-} для запрета автоматической обработки возможных ошибок ввода/вывода.
Данная директива как бы сигнализирует компилятору, что программа сама будет осуществлять контроль возможных ошибок. Следом за инструкцией открытия файла не забудьте указать директиву {$I+} для восстановления автоматической обработки возможных ошибок ввода/вывода.
На рис. ниже представим блок-схему алгоритма, реализующего открытие файла для добавления, которое обеспечит создание файла ( и в результате устранит ошибку, возникающую при возможности открытия несуществующего файла) в том случае, если открываемый для добавления файл отсутствует на диске.

Предложим фрагмент программы, который реализует вышеприведенный алгоритм действий.
. . .
AssignFile(fn,filename);
{$I-}
Append(fn) // открываем файл для добавления в него информации
{$I+}
if IOResult<> 0 // ошибка открытия файла then
Rewrite(fn); // открыть файл для записи
// здесь открыт существующий или новый файл
. . .
Перед окончательным завершением своей работы программой должны быть закрыты все открытые файлы. Чтобы это осуществить в языке Delphi, нужно сделать вызов процедуры close. Данная процедура содержит всего лишь один параметр – наименование файловой переменной.
Пример
откуда fn обозначает имя файловой переменной. Итак, мы разобрали некоторые ошибки открытия файлов Delphi. Двигаемся дальше.
Похожие записи:
- Типы данных Delphi
- Назначение файла Delphi
- Цикл case Delphi
- Циклы Delphi
- Цикл for Delphi
|
vlados2441 3 / 3 / 4 Регистрация: 11.01.2015 Сообщений: 126 |
||||
|
1 |
||||
Ошибка открытия файла через мою программу15.02.2015, 15:12. Показов 1411. Ответов 5 Метки нет (Все метки)
Всем доброго времени суток. Решил создать прогу в Делфи, которая шифрует файлы. Но проблема не в этом. Когда я нажимаю -Открыть- , появляется ошибка , но текст с файла все равно грузится. Помогите исправить. Исходник
__________________
0 |
|
Sigin 225 / 224 / 112 Регистрация: 20.10.2013 Сообщений: 808 |
||||
|
15.02.2015, 15:22 |
2 |
|||
|
Решение
1 |
|
3 / 3 / 4 Регистрация: 11.01.2015 Сообщений: 126 |
|
|
15.02.2015, 15:40 [ТС] |
3 |
|
О, спасибо, работает.
0 |
|
Mawrat 13090 / 5871 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||
|
15.02.2015, 17:39 |
4 |
|||
|
vlados2441, классы, унаследованные от TStrings, имеют метод LoadFromFile(). С помощью этого метода выполняется загрузка данных из текстового файла:
Ещё есть метод SaveToFile(‘путь к файлу’) — с помощью него содержимое экземпляра TStrings записывается в указанный файл.
0 |
|
пофигист широкого профиля 4599 / 3059 / 850 Регистрация: 15.07.2013 Сообщений: 17,624 |
|
|
15.02.2015, 19:06 |
5 |
|
Mawrat, думаю ТС нужно было мемо только для визуального контроля что он хоть что-то прочитал. Для шифрования файлов, заявленного в топике, мемо не очень-то нужно.
0 |
|
13090 / 5871 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
|
|
15.02.2015, 19:23 |
6 |
|
Да, в самом деле, цель — шифрование. Тогда с файлом надёжнее работать, как с бинарным, наверное. Читать через BlockRead() или использовать файловый поток TFileStream.
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
15.02.2015, 19:23 |
|
6 |
Здравствуйте! Вижу вопрос уже канул в лету, а проблема то осталась. Немного переформулирую.
Возникла небольшая проблема и я никак не могу понять, в чём тут может быть дело. Есть код:
...
odOpenF.FileName:='';
if odOpenF.Execute then
begin
try
//При выполнении следующего оператора возникает исключительная ситуация
EXL:=CreateOleObject('Excel.Application');
EXL.Visible:=false;
EXL.Workbooks.Open(odOpenF.FileName);
...
Причём возникает только в том случае, если я в появляющемся dialog открытия файла, дважды щёлкаю по выбираемому файлу, а не выбираю, а затем нажимаю «Открыть» (в этом случае всё проходит нормально).
Без try.. except.. end возникают следующие ошибки:

А иногда:

Ещё пару раз выдавал что-то там «недостаточно ресурсов», но я тогда не отскриншотил, а сообщение больше не появлялось.
Причём видимых причин для всего этого нет.
Ещё проводил один любопытный тест, в коде (на том месте где комментарий) писал MessageDlg(odOpenF.FileName, mtInformation, [mbOk], 0) (ну мало ли, а вдруг как-то полевому заполняется FileName). После этого ошибка снова переставала возникать.
В общем резюмируя скажу: что-то глючит. Однозначно где-то я ступил в коде, где именно — без понятия. Может быть вы подскажите?
Дополнение. Сегодня тестил на других компьютерах — ошибок не было. Похоже программа глючит только с ОСью х64
Сообщение было отмечено Памирыч как решение