Как открыть файл в delphi
Как открыть файл в delphi
То, что мы узнали в предыдущей части урока, позволяет работать с файлами по адресу, жёстко записанному в тексте программы. Мы же хотим иметь возможность открывать любые файлы и работать с файлами по нашему выбору. Естественно, Delphi предоставляет нам такую возможность. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов. Delphi диалоги выбора файла позволяют указать програме, с каким файлом мы хотим работать.
В обработчике OnClick кнопки «Открыть. » пишем:
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
В результате выбора файла свойство FileName компонента OpenDialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo.
Всё это хорошо, но только в данном случае, когда записанное выражение записывается в одну строку. Если программа использует несколько раз выражение OpenDialog1.FileName, то писать руками устанешь. В Delphi для такого случая есть так называемый «оператор присоединения» with. Он используется для любых объектов, имеющих длинный «хвост» из свойств, которые приходится записывать многократно. Вот как он записывается:
Свойства Объекта внутри логических скобок begin/end можно записывать непосредственно. Допускается перечислять через запятую несколько объектов. Естественно, в случае, когда внутри скобок находится один оператор, они необязательны. Перепишем фрагмент загрузки файла с использованием оператора присоединения:
with OpenDialog1, Memo1 do
if Execute then
Lines.LoadFromFile(FileName);
Запись получается более компактной.
Так как свойства компонентов OpenDialog и SaveDialog одинаковы, сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки «Сохранить как. » и пишем:
with SaveDialog1, Memo1 do
if Execute then
begin
Lines.SaveToFile(FileName);
OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник
end;
Наконец, для кнопки «Сохранить» пишем:
Memo1.Lines.SaveToFile(OpenDialog1.FileName); // Сохраняем туда, откуда считали
При работе этих фрагментов можно заметить, что выбирать приходится из всех файлов в нужной директории. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по нашему выбору. Для этого используются фильтры, свойство Filter в наших компонентах. Настраивается оно в Инспекторе Объектов. При выборе его можно перейти в редактор фильтров:
Свойство Delphi диалогов Title позволяет записать в заголовок нужную нам фразу. Если оставить его пустым, то в заголовке будут стандартные «открыть» или «сохранить»
Свойство InitialDir позволяет в момент открытия оказаться в нужной нам директории. Оно доступно как на этапе «конструирования», так и программно.
Теперь, пользуясь всем пройденным материалом, можно решить задачку на тему: как определить размер файла
Delphi работа с файлами
Delphi 7. Занятие 1_10.
Сохранение результатов разработки программы.
Создавая текст программы, в процессе работы над ней и по окончанию её мы сохраняем на диск проект и все модули. Выбрав «Save All … » в меню «File» мы автоматически сохраняем все файлы проекта.
Выбрав «Save», сохраняем текущий модуль. «Save As …» позволяет переименовать модуль и вместо стандартного имени Unit1 задать более осмысленное имя, состоящее из латинских букв, цифр и знака подчёркивания.
«Save Project As …» позволяет задать имя всему проекту, отличное от project1.
«Close» закрывает активную вкладку.
Но всё это касается файлов самого проекта.
А как быть, если надо сохранить данные, полученные в ходе работы программы? Это могут быть числа, текст, массив, запись (о типе данных запись поговорим позднее), отдельный символ (тип данных char).
Это могут быть просто цепочки байт, описывающих, например, изображение. В этом случае говорят, что записываются блоки памяти.
Разберёмся, как это делается.
Сохранение результатов расчётов.
В файле, как и в оперативной памяти, данные хранятся в виде нулей и единиц.
При записи какого-либо типа данных они превращаются в двоичный поток и записываются на диск.
При чтении с диска происходит обратный процесс. Благодаря тому, что известен тип записанных на диск данных, двоичный поток преобразуется в конкретный тип данных.
Предположим, мы прочитали с диска последовательные 32 бита (4 байта). Если файл описан как файл целого типа, то эти 4 байта будут интерпретированы как целое число.
Если файл хранит короткие строки (пример: type sh=char[20], то есть короткая строка — это массив символов. В короткой строке не может быть больше 255 символов),то байты будут интерпретированы как 4 символа.
То есть интерпретация содержимого, записанного на диск, зависит от описанного в программе типа файла.
Файл для хранения текста.
В delphi работа с файлами несколько различается в зависимости от того, надо ли записывать в файл произвольный текст, или это будет последовательность однотипных данных.
С текстовыми файлами мы сталкиваемся, например, создавая документ в программе «блокнот».
Для работы с текстовым файлом объявляется переменная:
var vMyTextFile:TextFile;
где TextFile – предопределённый тип файла.
Далее переменная связывается или с создаваемым на диске, или с существующим файлом. Например, мы хотим создать файл «D:\MyFile.txt».
Свяжем переменную vMyTextFile c именем файла с помощью процедуры:
AssignFile(vMyTextFile, s);
Теперь, когда мы употребим переменную vMyTextFile в операторах чтения или записи, поток данных будет направлен в «D:\MyFile.txt».
Создадим файл процедурой:
Rewrite( vMyTextFile);
Если посмотреть в проводнике, то мы обнаружим наш файл «D:\MyFile.txt» с нулевой длиной.
Осталось заполнить его данными.
Замечание.
Если файл с таким именем и путём доступа уже существует на диске, то он будет уничтожен и создан заново с пустым содержанием.
Запись в текстовый файл.
Рассмотрим, как осуществляется в delphi запись в файл.
Чтобы текст правильно читался из файла, необходимо, чтобы он был разбит на предложения.
Это достигается записью в конце каждого предложения специального знака #10 (#10 — это код символа в таблице символов. В текстах описаний обозначается как EOL — End Of Line. О кодировке символов и таблице символов разговор будет в дальнейшем).
Запись такого символа происходит автоматически, если использовать процедуру:
Квадратные скобки обозначают, что указанные в них выражения могут присутствовать, а могут и не присутствовать в процедуре. Эти скобки употребляются при описании операторов в общем виде и не должны присутствовать в реальном тексте программы.
Замечание.
Не используйте процедуру Write вместо WriteLn, иначе получите в файле «кашу» или ошибку записи!
Чтобы при чтении текстового файла было понятно, что все записи закончились, в конце последней записи кроме знака конца строки ставят специальный знак конца файла — #26.
Далее мы можем завершить работу с файлом, или переоткрыть его для чтения.
Если, прочитав из файла несколько значений, возникает необходимость дописать строки в конец файла, то его надо переоткрыть процедурой Append(unit1.vFile).
Замечание.
К сожалению, текстовый файл нельзя исправлять напрямую. Нельзя, например, переписать вторую строку.
Для внесения изменений надо прочитать весь файл, отобразить его в каком либо компоненте, например memo, отредактировать, заново пересоздать файл и перезаписать текст из memo в файл.
Завершение работы с файлом закрывает файл. С практической точки зрения это означает, что к файлу больше нельзя обратиться процедурами записи или чтения. С другой стороны, теперь файл доступен для удаления и редактирования средствами файловой системы, например, с помощью «блокнота».
Замечание. Закрытие программы автоматически закрывает все открытые файлы. Управлять файлами (например удалить, переименовать и так далее) можно из программы, используя предназначенные для этого процедуры и функции (об этом разговор будет позже).
Чтение из текстового файла.
Чтобы организовать в delphi чтение из файла, его надо предварительно открыть процедурой Reset.
Эта процедура устанавливает внутренний указатель файла на нулевую запись.
Открытие файла осуществляется через файловую переменную: Reset(vMyTextFile).
Поэтому достаточно записать ( vMyTextFile, s1); и использовать этот оператор в цикле, отслеживая значение функции признака конца файла EOF(vMyTextFile).
При чтении последней записи из файла эта функция возвращает значение «true» — истина (служебное слово — предопределённая логическая константа. О логических константах и переменных и о том, как ими пользоваться, речь будет в дальнейшем. Другое возможное значение: «false» — ложь).
Замечание.
Использование «пустой» процедуры чтения в виде ReadLn( vMyTextFile) осуществляет переход к следующей записи.
Пример программы работы с текстовым файлом рассмотрен в видеоматериале.
Цикл чтения строк из текстового файла.
Так как с помощью процедуры ReadLn() можно прочитать только одну строку, то необходимо организовать цикл чтения строк из файла.
Он будет длиться до тех пор, пока не будет достигнут символ конца файла EOF.
Ранее мы уже рассматривали организацию цикла с помощью оператора for.
Но для его использования мы должны точно знать число его повторений. Для текстового файла это проблематично, поэтому удобней использовать цикл с так называемым пост условием:
repeat
«выполняемые операторы»
until условие
Если «условие» вырабатывает (возвращает) значение false, то цикл продолжается, если true — то завершается.
Или в нашем случае:
repeat
ReadLn(vMyTextFile,s);
Form1.Memo1.Lines.Append(s);
until EOF(vMyTextFile)
Войдя в цикл, выполняются находящиеся в нём операторы. Далее проверяется условие, находящееся в операторе until. Когдафункция EOF() вернётtrue(будет достигнут конец файла), цикл завершится и будет выполнен следующий за ним оператор.
Для примера напишем программу, на главной форме которой разместим новый компонент Panel, предназначенный для группировки на нём других компонент.
Видео. Создаём форму для будущей программы.
Видео. Настраиваем свойства компонентов.
Видео. Создаём обработчики событий для записи и чтения данных из файла.
Видео. Дописываем данные в конец файла.
Обратите внимание. При работе с файлом мы нигде не проверяли, существует ли файл на диске. Если попытаться открыть несуществующий файл, то произойдёт исключительная ситуация, будет выведено сообщение об ошибке и выполнение программы прервётся. Чтобы избежать прерывание программы при возникновении системной ошибки, применяют программную обработку таких прерываний. Об обработке исключительных ситуаций речь будет в дальнейшем.
Заключение.
Рассмотрено понятие «текстовый файл», организация данных внутри файла, дано понятие конца записи и конца файла. Даны операторы создания файловой переменной и её связывания с конкретным файлом, а также операторы записи в него строковой информации и закрытия файла.
Для чтения/записи текстовый файл надо открыть, при этом указатель установится на нулевую запись.
Оператор чтения строки считывает ровно одну запись. Весь текст считывается путём организации цикла.
Глоссарий.
Открытие файла для вывода Delphi
Продолжаем тему «Файлы в языке Delphi». В предыдущей статье мы рассмотрели назначение файла и вывод данных в файл. Однако прежде чем вывести в файл необходимую информацию, файл для начала нужно открыть. В чем заключается открытие файла для вывода Delphi?
Если в процессе работы программа, которая формирует конечный выходной файл, уже применялась, то есть вероятность, что данный файл с полученными результатами работы этой программы уже имеется на жестком диске ПК. По этой причине перед программистом встает вопрос: что делать со старым файлом?
Вариантов развития событий два: либо провести замену старых данных новыми, либо осуществить добавление новых данных к старым. Способ применения старого варианта вырисовывается в момент открытия файла. Итак, наиболее предпочтительными являются следующие два режима открытия файла для записи полученных данных (т. е. внесения в него нужной информации):
Для открытия файла, используя режим создания нового файла, либо замены уже имеющегося файла, нужно воспользоваться процедурой Rewrite(fail), откуда fail — является файловой переменной, имеющей тип данныхTextFile. Для открытия файла, используя режим добавления данных к уже существующему файлу, используйте процедуру Append(fail), где fail — есть файловая переменная, имеющая тип данных TextFile.
Примеры программ на открытие файла для вывода Delphi
Создадим программу, которая бы записывала или добавляла данные в текстовый файл. На рис. ниже представим диалоговое окно данной программы:
А частичный исходный код (расположен ниже) программы немного прокомментируем.
Работа с файлами в Delphi: классика Pascal. Работа с типизированными файлами в Delphi
Удивительно, но факт – запрос “delphi файлы” в Яндексе – это один из самых популярных запросов, касающихся Delphi. Популярнее только “delphi скачать” – видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос – должен быть и ответ. Посмотрим, что получится в итоге.
Содержание статьи
Классика работы с файлами в Delphi – ключевое слово File
Этот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе.
Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например:
Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы:
Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы:
Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее:
Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:
При этом, для типизированных и не типизированных файлов работа в части чтения/записи несколько различается в плане используемых методов.
Работа с типизированными файлами в Delphi
Рассмотрим несколько примеров работы с типизированными файлами в Delphi.
Для начала, рассмотрим вариант работы с типизированным файлом, например, представленном выше:
Пример №1. Запись данных в типизированный файл Delphi
Запишем в наш файл две записи:
Рассмотрим методы, используемые в этом примере:
Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом.
Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла.
F – это переменная, связанная с внешним файлом с использованием AssignFile. RecSize – это необязательное выражение, которое можно указывать, только если F является нетипизированным файлом (об этом ниже).
Используется для записи в типизированный файл. F – файловая переменная, P1..PN – это переменная того же типа, что и тип файла F.
Прекращает связь между файловой переменной и файлом внешнего диска. F – это файловая переменная любого типа. Внешний файл, связанный с F, полностью обновляется, а затем закрывается, освобождая дескриптор файла для повторного использования.
В результате выполнения представленного выше кода, рядом с exe-файлом будет создан новый файл MyFile.txt, содержащий две записи, при этом, каждая запись будет иметь фиксированный размер, вне зависимости от фактических имени/фамилии.
Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi.
Пример №2. Добавление записей в типизированный файл Delphi
Рассмотрим такой пример Delphi:
Разберемся с тем, что здесь делается. Во-первых, условие:
проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание:
FileName – имя файла, существование которого необходимо проверить. Второй параметр – FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию).
Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл:
В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись:
Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре.
Метод Reset не воссоздает файл снова, как Rewrite, а открывает его для чтения/записи (в случае двоичных файлов). Что касается метода Seek, то он имеет следующее описание:
F – файловая переменная, ассоциированная с файлом на диске, N – номер записи в файле (первый номер – 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов:
где FileSize – это метод Delphi имеющий следующее описание:
В случае использования типизированных файлов эта функция возвращает количество записей в файле.
После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile – чтение всех записей из файла:
Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi:
Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False.
По аналогии с методом Write, метод Read производит чтение очередной записи из файла и имеет следующее описание:
Результат работы нашего примера может быть следующим:
Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate:
Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true).
Рассмотрим пример использования этой процедуры.
Пример №3. Удаление последних записей типизированного файла в Delphi
Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи:
В этом примере мы делаем следующее:
Подведем итог
Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:
В целом, рассмотренные выше примеры не охватывают всех возможностей работы с типизированными файлами в Delphi, а, скорее, показывают основные операции по работе с типизированными файлами. Поэтому ниже представлен перечень методов которые могут применяться при работе с типизированными файлами в Delphi/Pascal.
Функции и процедуры для работы с типизированными файлами в Delphi/Pascal
Создание и работа с текстовыми файлами в Delphi
Когда речь идет о работе программы с текстовым файлом, подразумеваются процедуры ввода данных из файла в программу или, наоборот, запись этих данных в файл программой. Для текстового файла допустима простая работа с файлом без особых дополнительных механизмов, которые применяются для работы со специализированными файлами, такими как при загрузке данных из Excel или работе программы с базой данных. Разумеется, Delphi располагает возможностями работать с файлами с использованием компонентов. Но в данной статье рассматривается механизм прямой работы с текстовым файлом без использования дополнительных компонентов.
Итак, в общем виде, работа с файлом заключается в следующих этапах:
1. подключение к файлу – связь с внешним файлом, указание режима подключения;
2. выполнение операций записи в файл или чтения из файла;
3. завершение работы с файлом.
Подключение к файлу
Для связи программы с файлом используется специальная переменная – «Файловая переменная». Объявляется она так же как и любая переменная в Delphi. Тип это переменной может быть File для типизированных (хранящих данные определенного типа) файлов, а можно указать TextFile, что будет означать тип обычного текстового файла. Объявление переменной:
В исполняемом коде программы выполняется подключение к внешнему файлу:
Команда AssignFile, выполняет связь файловой переменной с внешним файлом. Вторым параметром указывается адрес файла. Он может быть задан относительным или абсолютным. Если указать только имя файла, то программа будет пытаться обнаружить его в той же директории, где она сама и находится. Абсолютный путь указывается от корневого диска:
Использование относительной директории дает возможность не привязываться к конкретным дискам и адресам. Например:
После того как выполнено подключение, выполняется процедура, устанавливающая режим работы с файлом. В основном это режим чтения или записи. Эти режимы назначаются процедурами Reset() ( для чтения) и rewrite() (для записи):
* Для команды Rewrite() следует учитывать, что при ее выполнении, она либо создает файл, указанный в файловой переменной, либо если он уже есть перезаписывает файл заново, удаляя старый без какого-то предупреждения.
Любую из указанных команд можно использовать без команды AssignFile(). Для этого достаточно вторым параметром указать путь к файлу. Таким образом, она сразу выполнит привязку файла к файловой переменной и назначит режим работы с этим файлом:
Операции с файлами
Для чтения из файла, необходимо назначить режим чтения и использовать команду Readln(), которая будет вводить в строковую переменную по одной строке из файла. Затем с этой переменой можно выполнить необходимые действия.
Обычно для загрузки всех строк из файла используется оператор цикла. Для того, чтобы определить, что файл закончился используется функция EOF() (End Of File). Таким образом получается цикл, в котором последовательно в строковую переменную вводятся все строки файла и завершающийся после окончания фала:
Для записи, назначение режим записи в файл и командой Writeln() производится запись по строкам.
Закрытие файла
По завершении работы с файлами, особенно в случае записи в них данных, необходимо корректно завершить работу с файловой переменной. Это делается для того, чтобы сохранить все внесенные в файл изменения.
Примеры работы с текстовыми файлами в Delphi
Чтение в переменную одного значения из файла:
Загрузить все строки файла в компонент Memo:
Следует отметить, что для этой задачи проще воспользоваться командой самого компонента Memo LoadFromFile().
Записать строку в файл:
Записать в текстовый файл все строки из компонента Memo:
Как и для чтения из файла в Memo, так и здесь, имеется специальная команда:


