Delphi ошибка при открытии файла

Временами при работе с файлами в языке Delphi попытка открыть файл завершается неудачным образом и вызывает ошибку времени выполнения данной программы. Причинами ошибки открытия файлов Delphi могут быть следующие факторы.

К примеру, программа пытается открыть файл, расположенный на гибком диске, которой еще не готов к работе (не закрыт механизм дискового накопителя, либо диск отсутствует в накопителе).

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

Ошибки открытия файлов Delphi

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

Ошибки открытия файлов Delphi

Для того, чтобы программа самостоятельно контролировала результат исполнения операции открытия файла, нужно провести проверку значения функции IOResult (что означает результат ввода/вывода: Input-Output – ввод-вывод, а Result — результат). Функция IOResult принимает значение 0 в случае успешного завершения операции ввода/вывода, иначе возникает код ошибки (не 0).

Для обеспечения возможности проверки программой результата выполнения инструкций ввода/вывода следует разрешить программе это делать. Поэтому перед инструкцией, осуществляющей вызов процедуры открытия файла, необходимо указать директиву компилятору – строку {$I-} для запрета автоматической обработки возможных ошибок ввода/вывода.

Данная директива как бы сигнализирует компилятору, что программа сама будет осуществлять контроль возможных ошибок. Следом за инструкцией открытия файла не забудьте указать директиву {$I+} для восстановления автоматической обработки возможных ошибок ввода/вывода.

На рис. ниже представим блок-схему алгоритма, реализующего открытие файла для добавления, которое обеспечит создание файла ( и в результате устранит ошибку, возникающую при возможности открытия несуществующего файла) в том случае, если открываемый для добавления файл отсутствует на диске.

Ошибки открытия файлов Delphi

Предложим фрагмент программы, который реализует вышеприведенный алгоритм действий.

 . . .
AssignFile(fn,filename);
{$I-}
Append(fn) // открываем файл для добавления  в него информации
{$I+}
if IOResult<> 0 // ошибка открытия  файла then
Rewrite(fn); // открыть файл для записи
// здесь открыт существующий или новый файл
. . . 

Перед окончательным завершением своей работы программой должны быть закрыты все открытые файлы. Чтобы это осуществить в языке Delphi, нужно сделать вызов процедуры close. Данная процедура содержит всего лишь один параметр – наименование файловой переменной.

Пример

откуда fn обозначает имя файловой переменной. Итак, мы разобрали некоторые ошибки открытия файлов Delphi. Двигаемся дальше.

Здравствуйте! Вижу вопрос уже канул в лету, а проблема то осталась. Немного переформулирую.

Возникла небольшая проблема и я никак не могу понять, в чём тут может быть дело. Есть код:

...
 odOpenF.FileName:='';
 if odOpenF.Execute then
  begin
   try
    //При выполнении следующего оператора возникает исключительная ситуация
    EXL:=CreateOleObject('Excel.Application');
    EXL.Visible:=false;
    EXL.Workbooks.Open(odOpenF.FileName);
    ...

Причём возникает только в том случае, если я в появляющемся dialog открытия файла, дважды щёлкаю по выбираемому файлу, а не выбираю, а затем нажимаю «Открыть» (в этом случае всё проходит нормально).

Без try.. except.. end возникают следующие ошибки:

alt text

А иногда:

alt text

Ещё пару раз выдавал что-то там «недостаточно ресурсов», но я тогда не отскриншотил, а сообщение больше не появлялось.

Причём видимых причин для всего этого нет.

Ещё проводил один любопытный тест, в коде (на том месте где комментарий) писал MessageDlg(odOpenF.FileName, mtInformation, [mbOk], 0) (ну мало ли, а вдруг как-то полевому заполняется FileName). После этого ошибка снова переставала возникать.

В общем резюмируя скажу: что-то глючит. Однозначно где-то я ступил в коде, где именно — без понятия. Может быть вы подскажите?

Дополнение. Сегодня тестил на других компьютерах — ошибок не было. Похоже программа глючит только с ОСью х64

vlados2441

3 / 3 / 4

Регистрация: 11.01.2015

Сообщений: 126

1

Ошибка открытия файла через мою программу

15.02.2015, 15:12. Показов 1530. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем доброго времени суток. Решил создать прогу в Делфи, которая шифрует файлы. Но проблема не в этом. Когда я нажимаю -Открыть- , появляется ошибка

Ошибка открытия файла через мою программу

, но текст с файла все равно грузится. Помогите исправить. Исходник

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button3Click(Sender: TObject);
var
  buf: string;
  f: TextFile;
begin
  AssignFile(f,'C:UsersЯDesktopТекст.txt');
  {$I-}
    Reset(f);
  {$I+}
  if IOResult <> 0 then
  begin
    MessageDlg('Ошибка доступа к файлу',mtError,mbOKCancel,0);
    Exit;
  end;
  while not Eof(f) do
  begin
    Readln(f, buf);
    Memo1.Lines.Add(buf);
    CloseFile(f);
  end;
  end;



0



Sigin

225 / 224 / 112

Регистрация: 20.10.2013

Сообщений: 808

15.02.2015, 15:22

2

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.Button3Click(Sender: TObject);
var
  buf: string;
  f: TextFile;
begin
  AssignFile(f,'C:UsersЯDesktopТекст.txt');
  {$I-}
    Reset(f);
  {$I+}
  if IOResult <> 0 then
  begin
    MessageDlg('Ошибка доступа к файлу',mtError,mbOKCancel,0);
    Exit;
  end;
  while not Eof(f) do
  begin
    Readln(f, buf);
    Memo1.Lines.Add(buf);
    //CloseFile(f); - ошибка тут...
  end;
  CloseFile(f);
  end;



1



3 / 3 / 4

Регистрация: 11.01.2015

Сообщений: 126

15.02.2015, 15:40

 [ТС]

3

О, спасибо, работает.



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

15.02.2015, 17:39

4

vlados2441, классы, унаследованные от TStrings, имеют метод LoadFromFile(). С помощью этого метода выполняется загрузка данных из текстового файла:

Delphi
1
2
3
4
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:UsersЯDesktopТекст.txt');
end;

Ещё есть метод SaveToFile(‘путь к файлу’) — с помощью него содержимое экземпляра TStrings записывается в указанный файл.



0



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,864

15.02.2015, 19:06

5

Mawrat, думаю ТС нужно было мемо только для визуального контроля что он хоть что-то прочитал. Для шифрования файлов, заявленного в топике, мемо не очень-то нужно.



0



13095 / 5876 / 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

While opening a dfm file by double clicking, I am getting following error:

Class TMyClass not found. Ignore the error and continue? Note: Ignoring the error may cause components to be deleted or property values to be lost.

When I click Cancel, I get following message

Error creating form: Class TMyClass not found.

When I click OK now, pas file is opened only.

In pas file MyClass unit is added (which conatins the TMyClass defination) and its path is also added in my search path (Ctrl clicking on unit name, takes me to the unit file)

Everything is fine as per me. I don’t know why I am getting this error and why am I not able to open this dfm file in RAD studio? Please help.

  • Delphi ошибка unsatisfied forward or external declaration
  • Delphi ошибка stack overflow
  • Delphi ошибка list index out of bounds 0
  • Delphi ошибка for loop control variable must be simple local variable
  • Delphi ошибка e2033 types of actual and formal var parameters must be identical