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

Обновлено: 04.07.2024

В этом уроке рассмотрим очень важную тему в программировании - работа с файлами.
Практически в любой программе нужно копировать, открывать, изменять, сохранять, иногда удалять файлы.

Как известно, файлы имеют различные форматы и к ним применяются различные программы для обработки. Например, файлы рисунков BMP, текстовые файлы TXT и т.п. Файлы имеют различные имена и определенное расширение, имеющее в среде MS-DOS максимально три символа. Если у файла расширение RAR, то пользователь и операционная система знает, что это архиватор, причем windosw для обработки этого файла применяет средства, указанные в специальном разделе реестра.

Копирование файлов

Для копирования файлов применяется функция CopyFile. Формат ее такой:

CopyFile является функцией, которая возвращает флаг успешной или нет операции копирования.

Например, следующая строка:

Перемещение файлов

Для перемещения файлов применяется функция MoveFile. Она имеет следующий формат:

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

Переименование файлов

У всех вышесказанных командах параметры исходного и конечного файла имеет тип PChar. Это строковый тип с завершающимся нулем. Возможно, вы раньше слышали о таком формате строковых данных. В такую переменную можно занести строку очень большой длины. Ее размер ограничивается наличием нулевого байта в конце. Теоретически такая переменная может иметь бесконечный размер. На практике она ограничивается размерами выделяемой памяти для программы (2Гб).

Преобразование обычной строковой переменной, типа String в PChar производится функцией:

При этом, для команд файловых операций возможны объединение строк. Например:

procedure TForm1.Button1Click(Sender: TObject);

Var InDir,OutDir:String; // объявление строковых переменных

InDir:='c:\1\'; // каталог исходных файлов

OutDir:='c:\2\'; // каталог записуемых файлов

Здесь налицо операция соединения двух строковых переменных.

В итоге этой процедуры будет копирование файлов c:\1\1.txt и c:\1\2.txt в каталог c:\2. Файлы копируются под теми же именами.

Удаление файлов

Работа с текстовыми файлами. Чтение из текстового файла

На прошлых уроках мы как, в компоненте Memo процесс загрузки и записи текстового файла делался следующим образом:

Все это благодаря свойству Lines, в котором хранятся строки.

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

Следующий пример обработки текстового файла очень похож на аналогичную на языке Pascal.
Знающие люди могут ощутить разницу, поскольку есть некоторые отличия.

Varf:TextFile; // объявление файловой переменной

st:String; // строковая переменная

AssignFile(f,'c:\1.txt'); // привязка названия файла к файловой переменной

// отключение контроля ошибок ввода-вывода

Reset(f); // открытие файла для чтения

// включение контроля ошибок ввода-вывода

ifIOResult<>0 then // если есть ошибка открытия, то

ShowMessage('Ошибка открытия файла C:\1.TXT');

Exit; // выход из процедуры при ошибке открытия файла

While not EOF(f) do // пока не конец файла делать цикл:

ReadLn(f,st); // читать из файла строку

ShowMessage(st); // выводить строку пользователю

CloseFile(f); // закрыть файл

Прокомментирую некоторые строки этого примера.

Команда AssignFile осуществляет привязку строки пути файла к файловой переменной. Все дальнейшие операции с файловой переменной автоматически осуществляются с указанным файлом. Для избежания путаниц, указывайте полный путь к файлу.

и являются директивами компилятору, что в этом месту соответственно следует отключить и включить контроль ошибок ввода-вывода. В данном случае при неудачной попытке открытия файла c:\1.txt (файл отсутствует или открыт для записи другой программой) наша программа не выдаст аварийной ошибки и продолжит выполнение данной процедуры. Это свойство полезно для обработки всех возможных случаев в работе программы.

Работа с текстовыми файлами. Запись в текстовый файл

procedure TForm1.Button1Click(Sender: TObject);

Var f:TextFile; // указатель на текстовый файл

AssignFile(f,'c:\1.txt'); // привязка названия к переменной

Append(f); // открыть файл для добавления

if IOResult<>0 then // если ошибка открытия (напр. файла нет)

Rewrite(f); // создать новый файл

if IOResult<>0 then // ошибка создания файла

ShowMessage('Ошибка создания файла C:\1.TXT');

WriteLn(f,'Привет'); // запись в файл строки с символами перевода строки

CloseFile(f); // закрыть файл

Процедура Append(Файл) открывает файл для записи и устанавливает указатель записи в конец файла, т.е. все добавляемые к файлу строки будут записаны в конец файла.

В нашем случае в самом начале файла 1.txt может не оказаться на диске, поэтому команда открытия файла для добавления вызовет ошибку. В этом случае срабатывает наш собственный контроль ошибок и выполняется команда создания файла.

Запись и чтение из файла не текстовых данных

Рассмотрим пример, в котором программа при выходе сохраняет свои размеры и положение окна на экране в файл и при последующем запуске восстанавливает состояние, которое было при выходе. Программа состоит из двух процедур OnShow и OnClose для окна Form1 программы.

procedure TForm1.FormShow(Sender: TObject);

Var f:file of Integer; // файловая переменная, тип integer

i:Integer; // целочистенная переменная

begin

if IOResult<>0 then Exit;

Read(f,i); //считать из файла значение

Form1.Top:=i; // верхнее положение окна

Form1.Left:=i; // левое положение окна

Form1.Width:=i; // ширина окна

Form1.Height:=i; // высота окна

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Var f:file of Integer;

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

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

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

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

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

Автоматическая обработка ошибок Delphi

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

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

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

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

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

. . .
AssignFile(fn,filename);

Append(fn) // открываем файл для добавления в него информации

if IOResult<> 0 // ошибка открытия файла then
Rewrite(fn); // открыть файл для записи
// здесь открыт существующий или новый файл
. . .

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

Пример

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

Обычно, в процессе выполнения первоначальные данные в программу вводятся пользователем с клавиатуры – такой способ использования исходных данных порой занимает определенное время. Однако в языке Delphi, как и в других языках программирования, программа может считывать первичные данные, например, из текстового файла.

Осуществим ввод из файла Dephi, следуйте следующей пошаговой рекомендации:

  1. объявление файловой переменной типа TextFile,
  2. назначение этой файловой переменной (применяя функцию AssignFile) имени файла, из которого первичные данные будут вводиться,
  3. открытие файла для чтения,
  4. чтение (ввод) данных с использованием инструкции read или readln.

Открытие файла для чтения Delphi:

Чтобы открыть файл для ввода(чтения), используют процедуру Reset, обладающей одним параметром – файловой переменной. Перед вызовом данной процедуры нужно связать файловую переменную с конкретным(реальным) файлом при помощи функции AssignFile.

Пример. (Вызов инструкции открытия файла для ввода):

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

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

Как и в случае открытия файла для записи, программой может быть проведена обработка возможной ошибки в момент открытия файла, используя проверку значения функции IOResult. Ниже представим фрагмент исходного кода программы, в котором проводится проверка результата открытия файла с применением функции lOResult.

Пример. (Обработка ошибки при открытии файла (используется функция IOResult Delphi))

Последний раз редактировалось Sultik.rinat, 01.03.2013 в 09:11 . Последний раз редактировалось Budjaka, 01.03.2013 в 11:27 .

Варианты переустановки вообще не подходят, потому что программа в будущем будет на нескольких компах, а на всех компах нет возможности переустановить офис. и XLS тоже не подходит.
Так а почему раньше-то работал нормально, офис тот же стоял всегда.

Это куда-то залезать надо, чтобы имя это поменять? А куда?

И ещё вопрос: а почему я открываю только для чтения, а при закрытии у меня всегда вылетает окно с вопросом "Сохранить изменения?"

Последний раз редактировалось Sultik.rinat, 01.03.2013 в 12:19 .

Это куда-то залезать надо, чтобы имя это поменять? А куда?

И ещё вопрос: а почему я открываю только для чтения, а при закрытии у меня всегда вылетает окно с вопросом "Сохранить изменения?"

1. У тебя поле / имя листа / или любой другой идентификатор в книге - совпали с именем функции (итп) самого офиса. Отсюда невозможность открыть. Нужно выяснить что именно мешает работать. И в выдающейся ошибке думаю есть подсказка.
2. У тебя код :
Excel := CreateOleObject('Excel.Application');
Excel.WorkBooks.Open('S:\Абоненты.xlsx',ReadOnly:= True);
Excel.Close (или что то в этом духе);
Выполнив его единожды - и поймав ошибку на 2й строке - ты открыл книгу экселя, и твой код прервался. Т.е. excel.close - не судьба была. И неважно закрыл ли ты Делфи или нет - эта книга висит у тебя в памяти, и поэтому
я открываю только для чтения, а при закрытии у меня всегда вылетает окно с вопросом "Сохранить изменения?
Нажми Ctrl + Alt + Del - и взгляни сам : у тебя в процессах висит твой запущенный Exсel. Или два. Или десять :-) (смотря сколько раз пытался).
Убей их всех
1.1. P.s. а проблема твоя довольно распространена, в связи с глюками Екселя. Сам искал одно время. Вот вам копипаста, чтобы по ссылкам не ходить :
Последний раз редактировалось Budjaka, 01.03.2013 в 16:58 . 1. У тебя поле / имя листа / или любой другой идентификатор в книге - совпали с именем функции (итп) самого офиса. Отсюда невозможность открыть. Нужно выяснить что именно мешает работать. И в выдающейся ошибке думаю есть подсказка.

2. У тебя код :
Excel := CreateOleObject('Excel.Application');
Excel.WorkBooks.Open('S:\Абоненты.xlsx',ReadOnly:= True);
Excel.Close (или что то в этом духе);
Выполнив его единожды - и поймав ошибку на 2й строке - ты открыл книгу экселя, и твой код прервался. Т.е. excel.close - не судьба была. И неважно закрыл ли ты Делфи или нет - эта книга висит у тебя в памяти, и поэтому

Нажми Ctrl + Alt + Del - и взгляни сам : у тебя в процессах висит твой запущенный Exсel. Или два. Или десять :-) (смотря сколько раз пытался).
Убей их всех

До этого окно сохранения всё равно появлялось, хотя ошибки не было при открытии. И закрывала программа ексель нормально. Кароче файл открывался только для чтения, ошибки сначала небыло, и при закрытии файла появлялось окно сохранения изменений (хотя никаких изменений не было). После закрытия этого окна эксель закрывался. Потом появилась эта ошибка про конфликт имён. При том что офис я не переустанавливал, то есть до этого программа исправно работала на этом офисе, а потом на этом же офисе появилась эта ошибка. А если точнее ошибка появилась после добавления в программу компонента tcpclient (может в этом дело? хотя при чём тут это?)

Ошибка при открытии файла
Запускаю программу на выполнение for i:=0 to k-1 do if MatchesMask(Spisok, '*ir.zak') then .


Ошибка при открытии файла TFileStream.Create
В общем мне нужно: если не удается найти файл, то пропустить ошибку и идти дальше, а то код после.

Ошибка Access violation при открытии файла
При открытии файла, выдает ошибку &quot;Access violation. &quot; (скриншот прикрепил). Подскажите.

Или у Вашего друга установлен дополнительный компонент которого нет в Вашем компиляторе у Вашего друга установлен дополнительный компонент и называется он TPazle
и даже возможно он есть в исходниках, которые вам дали
но узнать об этом никто не сможет. так же если открыть просто файл Pazle, то там появляется полностью код, но формы нет правильно,
но если вы все делаете как должно бы, вы открываете файл Group.bpg
и я угадаю, что в списке проектов их целых два
проект PackageGame, скорее всего, и содержит компонент Pazle
на правой кнопке мыши у него есть пункт Install.

Спасибо, помогло! Подскажите еще пожалуйста как поменять картинку которая автоматически запускается.

Добавлено через 11 секунд

здесь нет ни слова про картинку, которая автоматически запускается с картинкой я разобрался, но почему то все равно при открытии проекта код не полностью появляется где?
какой код?
почему он должен "полностью появляться"?
какие файлы открыл те и смотри

ProgressBar при открытии файла
Всем драсьте. Как сделать, чтобы при открытии файла (.txt) показывал ProgressBar т.е якобы он.

Ошибка при открытии формы
Доброго времени суток! Ошибка (скрин во сложении) возникает только на компьютерах отдельного.

Ошибка при открытии программы
Подскажите пожалуйста, что это за ошибка, создал Setup для проги, при установки на другой компьютер.

Читайте также: