Delphi прочитать файлы в каталоге

Обновлено: 03.07.2024

Сохранение данных в типизированный файл.

Предварительные замечания.

Прежде, чем начать разговор о нетипизиованных файлах, сделаем ещё несколько замечаний по поводу записи в типизированный файл в delphi.

Они будут необходимы нам в дальнейшем при работе с нетипизированными файлами.

Позиционирование указателя типизированного файла.

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

Для обращения к записи по её номеру существует процедура позиционирования:

seek(файловая_переменная, номер_записи) //помним, что отсчет ведутся от 0)

Создадим файл для хранения целых чисел. Запишем в него 5 значений. Проконтролируем записанные значения чтением из файла и отображение их в memo.

Определим размер файла функцией FileSize(ф.п.).

Затем установим указатель файла в четвёртую позицию (то есть номер_записи=3).

Изменим значение записи в этой позиции и вновь проконтролируем результат.

Для решения задачи подготовим форму:

типизированный файл в delphi

Воспользуемся полученной информацией и ещё раз посмотрим, как в delphi записать в файл данные фиксированной длины и какие процедуры и функции для работы с файлами нам для этого понадобятся.

Создадим обработчики событий для первой и второй кнопок:

var vFileInt:File Of Integer; // создаём переменную для ссылки на типизированный файл

procedure TForm1.Button1Click(Sender: TObject);

rewrite(vFileInt); //создаём файл

j:=filePos(vFileInt); //контролируем положение указателя файла

write(vFileInt,j); //формируем значения и записываем их в файл.

j:=filePos(vFileInt); //опять контролируем положение указателя в файле

j:=fileSize(vFileInt); //проверяем размер файла (количество записей)

reset(vFileInt); //переоткрываем файл. При этом указатель файла устанавливается на 0.

while not EOF(vFileInt) do

read(vFileInt,j); //читаем файл и прочитанные значения отображаем в memo.

closeFile(vFileInt);

Форма после нажатия на первую кнопку:

чтение и запись файлов в delphi

procedure TForm1.Button2Click(Sender: TObject);

var j:integer; s:string;

reset(vFileInt);

seek(vFileInt,3); //устанавливаем указатель файла в четвёртую позицию (0,1,2,3)

write(vFileInt,j); //перезаписываем четвёртое значение

j:=filePos(vFileInt); //отображаем положение указателя файла после перезаписи.

reset(vFileInt);

while not EOF(vFileInt) do

read(vFileInt,j); //читаем и отображаем файл

closeFile(vFileInt);

Форма после нажатия на вторую кнопку:

чтение и запись файлов в delphi

Компонент TBitBtn

Продолжим знакомиться с компонентами. На вкладке Additional находится компонент TbitBtn.

Это кнопка с расширенным набором свойств.

Познакомимся с некоторыми из них, которые будут важны в данном занятии.

Если обычная кнопка TButton имеет минимальные возможности по формированию своего внешнего вида, то у TbitBtn таких возможностей гораздо больше.

Для записи в поток подготовим кнопу типа TbitBtn и настроим её так, чтобы она имела в конечном итоге вид:

типизированный файл в delphi

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

Для отображения названия кнопки в нескольких строках посмотрим, как хранятся строки в компоненте memo.

В окне текст отображается в виде отдельных строк. А в свойстве Memo1.Text он хранится в виде:

типизированный файл в delphi

В Object Inspector нельзя добиться вставки этих служебных символов в строку. Они будут воспроизведены как простой текст.

Чтобы служебные символы сыграли свою роль, надо отдельно сформировать строку с их присутствием и записать в свойство Caption.

Удобнее всего это сделать в обработчике создания формы:

procedure TForm1.FormCreate(Sender: TObject);

begin

end;

Цвет символов можно изменить, раскрыв свойство Font, нажав на «+». В выпадающем списке Color можно выбрать нужный цвет символов.

Как видно на рисунке, для кнопки можно организовать подсказку. Для этого надо заполнить свойство Hint (в нашем случае там написано «подсказка») и разрешить её отображать (выставить свойство ShowHint в true).

И наконец, на кнопке отображена небольшая пиктограмма. Она подготавливается заранее в текстовом редакторе и загружается через свойcтво Glyph).

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

Простые и структурированные типы данных.

Под переменные стандартных типов отводится оговоренное количество байт памяти. Под Integer 4 байта, под Double 8 байт, под Char 1 байт и так далее.

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

Совокупность длины переменной и способа интерпретации последовательности байт можно назвать типом данных.

Указанные типы называются простыми типами данных.

По мере развития вычислительной техники и возрастания её возможностей стали вводиться более сложные, структурированные типы данных.

Чтобы работать с типом данных «массив» надо хранить информацию о том, что мы имеем дело с последовательностью байт, где начинается эта

последовательность, указать общее количество байт и на какие «порции» надо делить эту последовательность (указать тип данных).

Обычный массив характерен тем, что длина всех элементов массива одинакова.

В отличие от него, динамический массив может иметь разную мощность по разным измерениям. Например, двумерный динамический массив может содержать по первому измерению 5 элементов, а по второму — 10.

Но тип всех элементов всё равно остаётся одинаковым. Например, Integer.

Тип данных «запись».

Объявляется запись следующим образом:

type tRec=record J:integer, sh:string[20]; ss:string; d:double; ar:array[1..3] of char; ex1,ex2:extended; end;

Нотация обращения к полям записи следующая:

vRec.d:=10.255; vRec.ex1:=456.89; vRec.ex2:=789.023;

Заметим, что полем может служить другая запись!

type tRec1=record JJ:integer, end;

type tRec=record J:integer, sh:string[20]; ss:string; d:double; ar:array[1..3] of char; ex1,ex2:extended; r1:tRec1 end;

Тогда для формирования значения JJ надо записать:

vRec.r1.JJ:=20;

Не прадо ли, очень похоже:

Form1.Memo1.Text ?

Теперь сделаем «петлю» и ещё раз вернёмся к типу «string».

Ещё раз о типе «string».

В типе «string» первые 12 байт служебные. В них указывается длина строки.

Номер кодовой таблицы символов (в какой язык интерпретировать числа, записанные в байтах, составляющих строку). Счётчик ссылок (он увеличивается на 1, когда выполняется s2:=s1, где s1 и s2 — строковые переменные).

Символы пронумерованы по порядку, начиная с 1. К символу номер N можно обратиться, записав s1[5]. Если, например, в s1 хранится слово «строка», то s1[4] вернёт символ «к».

На примере строки мы посмотрели, как усложняется описание типа. Непосредственно данным в памяти предшествует несколько байт, описывающих структуру этих данных.

Само обращение к данным происходит по ссылке (по адресу, который записан в переменной, объявленной как тип String).

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

Записи являются как бы предшественниками такого типа данных, как объект.

Понятие «объект» как особый тип данных.

К полям записи обращаются по нотации «переменная_запись»«.»«имя_поля».

Такая же нотация характерна и для объекта. Вспомним, что компоненты Delphi — это объекты, встроенные в IDE (в среду разработки).

Но объекты принципиально отличаются от записей. Настолько же, насколько обычная переменная отличается от динамической.

Объекты содержат не только данные (которые в объекте называются полями), но и процедуры (и функции).

К этим процедурам можно обращаться с помощью всё той же нотации с «точкой», как и к полям с данными.

Например, вспомним, как мы очищали содержимое компонента Memo (удаляли из него весь текст).

Для этого мы использовали процедуру (в объектах встроенные процедуры называются методами!) Clear. Так как ей не нужны параметры, её можно писать без скобок, то есть вместо Clear() записать просто Clear.

Поэтому мы использовали следующее предложение:

Form1.Memo1.Clear;

Сам объект Memo1 создаётся по шаблону (типу) Tmemo.

Более того. Сами типы являются объектами, поставляемыми со средой IDE. В них содержится метод (процедура) Create, называемый конструктором.

Собственно, он и создаёт экземпляр объекта в программе по собственному образу и подобию. Объект — тип может быть только один в пределах видимости IDE. Но своих копий (экземпляров) он может создать сколько угодно (конечно, каждому экземпляру должно быть дано уникальное имя).

В программе экземпляр объекта оформляется как переменная объектного типа.

Здесь объявлены переменная Form1 три переменных типа Tmemo.

var Form1: Tform1; Memo1:TMemo; Memo2:TMemo; Memo3:TMemo; и так далее.

Tform1, Tmemo и другие встроенные в IDE объекты-типы называются Delphi компонентами. При размещении компонента на форму IDE вызывает конструктор объекта-типа автоматически при размещении компонента на форму.

Замечание. На будущее — типы, по которым создаются объекты, в объектном программировании называются «классами (Class)».

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

Поэтому оставлю его здесь.

p.s. я его честно где-то стащил. 🙂

Delphi. Получение списка всех файлов в папке и ее подпапках. , 7.3 out of 10 based on 9 ratings

32 thoughts on “ Delphi. Получение списка всех файлов в папке и ее подпапках. ”

isFound := FindFirst( Path + ‘\\\\*.*’, faAnyFile, sRec ) = 0; Я не прогер и поэтому все что увидел в этой строке это целых два смайлика, а автор поста их тут увидит, интересно? А то ведь мы видим только то что привыкли. Можно еще пару символов за смайл принять, но как то не особо.

Ну приглядевшись, смайлики конечно видно.

Так же как узоры букв в книге если её не читать, а рассматривать.

Хорошо, но не то.
Код в посте заходит в папки. И выдает полное дерево. Твой, нет.

Этот гнилой код заполонил весь Интернет.
Он заходит только в одну подпапку!

В середине есть строки

if ( sRec.Attr and faDirectory ) = faDirectory then
GetAllFiles( Path + ‘\’ + sRec.Name, Lb );

догадайтесь зачем они вставлены.

Сейчас еще раз проверил. Собирает всю структуру.

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

А если нужно добавить только файлы с расширением mp3
помоги плз ото я не понял этот код

Бауыржан, попробуй вместо
isFound := FindFirst( Path + ‘\*.*’, faAnyFile, sRec ) = 0;

isFound := FindFirst( Path + ‘\*.mp3’, faAnyFile, sRec ) = 0;

и между строками

GetAllFiles( Path + ‘\’ + sRec.Name, Lb );
Lb.Items.Add( Path + ‘\’ + sRec.Name );

вставить условие проверки имени файла sRec.Name справишься или условие тоже подсказать?

верни код как было используй то, что в посте
с ‘\*.mp3’ косяк выходит

Спс тебе Большое .
Все получилось 🙂

GetAllFiles( dir, listbox1 );
end;

Автору большое спасибо, очень помогло. Очень много тех, кто не любит работать с ФС, то что нужно! )))

Сам периодически нахожу эту статью на блоге, чтобы скопировать код )))

в самой программе

У вас сразу три ошибки.

Первая, в таком виде код будет искать один файл, ведь вы превратили его в функцию, следовательно и вывод будет один.

Вторая такая же как в комментах выше.
Чтобы выбрать файл start.txt надо после рекурсивного вызова писать код

Посмотрите комменты. Тут я привел пример для процедуры, которая ищет файлы, а не функции которая ищут один.

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

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

Однако пока я разбирался, я написал нужную функцию, поэтому вот код:

ВСЕ БЫ ХОРОШО, НО В ДЕЛЬФИ НЕТ ХВОСТОВОЙ РЕКУРСИИ, А ЗНАЧИТ ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ПАПОК БУДЕТ ВЫЛЕТАТЬ ПЕРЕПОЛНЕНИЕ СТЕКА.

Даже не знал о таких вещах. )
Но как я понял стек не фиксированный, а резиновый. Зависит от памяти. И даже сотня папок ему не помеха.

Если стек фиксированный, то поправьте меня, буду иметь ввиду.

Если код похожий, а не такой же, то скинь, глянем.
Проверил код у себя. Нашел все файлы и папки.

привет.
отправлю тебе весь код
на форму закинь три кнопки , поле ввода edit1, листбокс listbox1 и метку label1

первая кнопка button1 отвечает за закрытие окна
вторая button2 отвечает за поиск
третья button3 за очистку метки и листбокса

в edit1 напиши с:\\ Проверки на наличие отсутсвие слеша \ у меня нет, не забудь поставить его в конце

если что не поймешь спроси

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
MainMenu1: TMainMenu;
N1: TMenuItem;
Button2: TButton;
Label1: TLabel;
Edit1: TEdit;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button3Click(Sender: TObject);

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var sozdaniefaila:tfilestream;//создание файла независимо от всего
logfail:TstringList; // используем эту переменнкю для ввода в файл поисковых данных
info: Tsearchrec; //переменная для поиска
tekkatalogiimja:string;//текущий каталог + имя файла
strokapoiska:string;// сюда записвыаем где надо искать
schet:longint; // счетчик найденных файлов

procedure initializazijalogfaila; //инициализация переменной logfail
begin
logfail:=tstringList.Create(); //инициализация переменной logfail
logfail.LoadFromFile(tekkatalogiimja); // связываание переменной с реальным файлом
end;

begin
schet:=0; //остановка счетчика файлов в ноль
sozdfaila; // создание файла log.txt в текущем каталоге
initializazijalogfaila; //инициализация этого файла
strokapoiska:=edit1.text; // в папке, заданной строкойпоиска начнется поиск

while findnext(info)=0 do
// пока в текущей папке находятся фалйы
begin

end;//конец второго while

if logfail.count=0 //если логфайл пуст
then //то
break; // выход из всех циклов

strokapoiska:=logfail.strings[logfail.count-1];//строке поиска присваивается значение последней строки в логфайле
logfail.delete(logfail.count-1); //после этоо последняя строка удаляется из логфайла
findclose(info); //освобождается память

end;//конец первого while

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

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

строчку
while findfirst(strokapoiska+’*.*’,faanyfile,info)=0 do
заменил на

с процедурами logfail.LoadFromFile(‘log.txt’)и logfail.SaveToFile(‘log.txt’)сейчас буду разбираться куда пристроить.

спсибо огромное,а то я уже даже отчаиваться начал.

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

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

А СКАЖИТЕ,МОЖНО КАК-ТО ПРОГРЕСС БАР ПРИСОЕДЕНИТЬ К ПОИСКУ ФАЙЛА?просто когда очень долго ищет хотелось бы знать идет процесс,или он ничего не делает

Не так уж и часто, но бывает надо в программе получить список файлов или поддиректорий в каталоге. Для тех, кто использует KOL и MCK открываются аж 3 способа решения этой проблемы. Правда нормальный, по моему мнению, все-таки только один 🙂 Рассмотрим все.

1-й способ. " Традиционный ."

Традиционно пользуются 3-мя API функциями: FindFirstFile (ищет первый файл из списка файлов), FindNextFile (ищет следующий файл) , FindClose (прекращение поиска). Обычно первые 2-е функции заменются их VCL-суррогатами FindFirst, FindNext. Для нас, они не совсем приемлемы, так как для того чтобы воспользоваться этими функциями, надо подключить библиотеку Sysutils. А это как известно добавляет лишний жирок в наши атлетически сложенные программы :-). Пример на чистом API с примесью KOL.

Пояснения на счет атрибутов для искомых файлов:

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

Это конечно интересный способ получать список файлов, но не функциональный 🙂 Не создавать ведь на окне каждый раз ListBox или СomboBox (он тоже имеет это же свойство), чтобы получить список файлов. Да и почему-то выводимый список файлов в виде " коротких имен " (т.е. как будто в DOS). Скорее всего Владимир Кладов добавил это свойство как интересную фичу и не более.

3-й способ. " Как положено "

Ну и самое интересное 🙂 В KOL есть объект предназначенный для создания списка фалов. Это PDirList. Вот его конструктор:

Список методов и свойств для работы с этим обьектом:

procedure Clear ; Очищает текущий список с файлами. procedure ScanDirectory ( const DirPath, Filter: String; Attr: DWord ); Сканирует директорию DirPath. Все передаваемые значения идентичны конструктору. procedure Sort ( Rules: array of TSortDirRules );

Сортировка списка файлов. Rules (условие сортировки) может быть следующим :

Возвращает количество пунктов в списке

Пример. Наверху в окне находится список дисков. Ниже находится список файлов и подкаталогов, находящихся в центральных каталогах этих дисков.

Размер кода 1,8 Кб. Размер программы 34,5 Кб (без сжатия и замены модулей). На экране увидите Вы примерно следующее:

Copyright © 2004-2019 "Delphi Sources". Delphi World FAQ

Delphi , Файловая система , Директории

Статья Получение списка вложенных каталогов раздела Файловая система Директории может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

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

Я работаю с delphi, мне нужен список всех файлов каталога при выполнении openpicturedialog.

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

вы даже можете предложить мне получить имя каталога из FileName собственность TOpenDialog
спасибо.

@Himadri, основной целью OpenPictureDialog не является выбор каталога, в любом случае, если вы используете этот диалог с другой целью, вы можете попробовать этот код.

Если вы используете delphi 2010, Вы можете использовать tdirectory.заражен сначала добавить ioutils.pas to uses затем напишите следующую строку кода в обработчике событий (в дополнение к коду, который у вас уже есть в этом обработчике событий)

изменить фильтр свойство в вашем OpenPictureDialog, чтобы включить все файлы:

затем использовать метод findfirst и методы findnext чтобы получить файлы в этот каталог.

вы можете использовать функцию extractFilePath, чтобы получить имя каталога:

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

Как известно, файлы имеют различные форматы и к ним применяются различные программы для обработки. Например, файлы рисунков 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;

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