Сайт о телевидении

Сайт о телевидении

» » Для работы с файлами delphi использует. Копирование файлов с помощью. Направление выходного потока вашей программы в файл

Для работы с файлами delphi использует. Копирование файлов с помощью. Направление выходного потока вашей программы в файл

Эта статья ориентирована на новичков, которые желают научиться работать с файлами в дельфи. В статье рассматриваются стандартные I/O операции с файлами, типичные ошибки и методы их предотвращения.

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

Step 1 - Обьявление файловой переменной

Файловая переменная в общем виде обьявляется в разделе var примерно так:

F: file of Type;

Например:

F: File of integer;

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

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

TDay = (MON, TUE, WED, THU, FRI, SAT, SUN);

F: File of TDay;

F: File of TDay;

Следует обратить внимание, что длина строковых полей в записи должна быть четко определена (Name: String)

Step 2 - Назначение и открытие файла

После обьявления файловой переменной нужно связать её с физическим файлом на диске. Сделать это можно с помощью процедуры AssignFile:

AssignFile(var F: File; FileName: String);

Например:

var F: TextFile;

AssignFile(F, "text.txt");

После выполнения процедуры файловая переменная F будет связана с файлом text.txt, находящимся в папке с программой. И все действия, производимые с переменной будут действовать именно на этот файл. Однако переменную можно освободить для дальнейшего использования с другим файлом процедурой CloseFile, но об этом ниже. Теперь необходимо открыть файл, причем одним из нескольких способов, в зависимости от ваших потребностей. Создать новый или перезаписать существующий можно с помощью процедуры Rewrite(F). Открыть для записи в конец файла можно с помощью процедуры Append(F). А открытие файла для чтения осуществляет процедура Reset.

Step 3 - Стандартные I/O опреации с файлами

I/O - это операции ввода/вывода (input/output). Здесь мы рассмотрим запись данных в файл и чтение этих данных. Сначала запись. Записать в файл можно переменную или константу того типа, которого был обьявлен файл. Например если файл был обьявлен вот так F: File of Integer, то в него можно будет записать данные только типа Integer. При попытке записать данные другого типа компилятор выдаст сообщение об ошибке. Запись в файл осуществляется процедурами Write(; P1; [...,Pn]) и WriteLn(; P1; [...,Pn]). Вторая отличается от первой тем, что она после записи параметра перемащает каретку на новую строку, т.е. следующий параметр запишется на новой строке. Вот пример использования процедур:

var F: TextFile;

Str:= "Some Text";

WriteLn(F, Str);

Write(F, "это будет на новой стоке ");

write(F, "а это на этой же строке");

Чтение данных происходит благодоря процедурам Read(; V1; [...,Vn]) и ReadLn(; V1; [...,Vn]). Отличиаются они тем, что после прочтения параметра процедурой ReadLn каретка перемещается на новую строку, даже если ещё были данные. Вот пример:

var F: TextFile;

ReadLn(F, Str2);//str2 будет содержать данные, идущие после str

Read(F, Str3);//str3 будет содержать данные, находящиеся на новой строке после str2

Думаю не все так сложно.

Step 4 - Закрытие файла

Файловую переменную после использования нужно обьязательно освободить, иначе программа не закроется и будет выдавать ошибку. Также освобождение файловой переменной будет полезно тогда, когда вам нужно работать с несколькими файлами последовательно, и после работы с первым файлом можно освободить переменную и связать её с новым файлом. Освобождение файловой перменной делает процедура CloseFile(F: File). Примера я думаю не надо, т.к. никаких особенностей у нее нет.

Я думаю новичку будет все же сложно будет без примеров разобраться в работе с файлами. Поэтому давайте расмотрим простейший пример программы, которая по нажатию одной кнопки будет запрашивать имя файла у пользователя и записывать содержимое TMemo. А по нажатию другой кнопки программа опять же будет запрашивать имя файла, читать от туда записанные данные и помещать их в TMemo. Знаю, что запись и чтение в TMemo можно организовать с помощью специальных методов. Но это всего лишь пример к статье. Вобщем кидайте на форму одну TMemo и две кнопки. Обработчик первой кнопки приведите к такому виду:

procedure TForm1.Button1Click(Sender: TObject);

FileName: String;

AssignFile(F, FileName);

for i:= 0 to Memo1.Lines.Count do

WriteLn(F, Memo1.Lines[i]);

Это кнопка будет сохранять текстовый файл. Итак, в разделе var я обьявил три локальные переменные: F типа TextFile это и есть файловая переменная для текстовых файлов; FileName типа String будет служить для хранения имени файла; И i типа Integer - для циклов. В первой строчке я запрашиваю у пользователя имя файла. Во второй я связываю файловую переменную с физическим файлом на диске. Строчка Rewrite(F) создает новый файл или перезаписывает существующий. ЧТо бы данные не заменялись а добавлялись в конец файла эту строчку нужно заменить на Append(F). Далее идет цикл с 0 до количества всех строк Memo1. В цикле содержимое все строк Memo1 по порядку записывается в файл. Обратите внимание, что я использую WriteLn для записи новой строчки. Если бы я использовал Write, то все строчки Memo1 в файле превратились в одну.

Обработчик второй кнопки должен выглядеть примерно так:

procedure TForm1.Button2Click(Sender: TObject);

FileName, tmp: String;

FileName:= InputBox("Имя файла", "Введите имя файла", "default.txt");

AssignFile(F, FileName);

while not EOF(f) do

Memo1.Lines.Add(tmp);

Назначение локальных переменных в этой процедуре аналогичны предудыщим. Первая и вторая строчка аналогичны строчками из обработчика первой кнопки. Reset(F) - это я открываю файл для чтения процедурой Reset. Далее запускается цикл по всему файлу (while not EOF(F) do). Функция EOF(F: File) возвращает true когда достигнут конец файла. В цикле читается одна строчка из файла в переменную tmp и добавляется в Memo1. Вот и все, думаю довольно просто. Однако программу легко обмануть и вызвать исключение. Например при чтении файла пользователь может задать имя несуществующего файла. Тогда возникнет ошибка. Далее мы поговорим о способах защиты программы от исключений

Способ 1 - Простейший

Конечно простейший, но достаточно эффективный способ защиты можно организовать с помощью вложенных блоков try - except и try - finally. Вы знаете, что если при выполнении инструкции в теле блока try - except происходит исключение, то выполнение дальнейших инструкций останавливается и выполняется то, что находится между except - end. Но если возникло исключение, а далее находится CloseFile(F), то эта процедура не выполняется и программа не сможет корректно работать и завершиться. Решение этой проблемы - использование вложенных try - except и try - finally. Вот пример

MessageDlg("Ошибка работы с файлом", mtError, , 0);

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

Способ 2 - Эффективный

Известно, что программа сама берет на себя обработку исключений. Но она не всегда делает это правильно. Поэтому лучшим решением было бы самому проконтролировать момент открытия файла. Для этого нужно сначала отключить автоматическую обработку исключений директивой {I-}. А включить можно так: {I+}. Потом свериться со значением функции IOResult. При успешном открытии файла она возвращает 0. Вот пример:

if IOResult<>0 then

MessageDlg("Файл "+PChar(FileName)+ " несуществует", mtError, , 0);

EXIT; //продолжать нельзя

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

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

Способ объявления файла зависит от его типа. Различают три типа файлов:

текстовые ;

типизированные ;

нетипизированные .

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

Описание текстового файла :

var имя_переменной: TextFile;

Типизированный файл состоит из элементов одного типа, число которых заранее не определено и может быть любым. Он так же заканчивается символом «конец файла». Данные в типизированном файле хранятся в двоичных кодах и не просматриваются текстовыми редакторами. Объявление таких файлов имеет вид:

имя_переменной: file of тип;

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

var имя_переменной: file;

Для доступа к файлам используют специальную файловую переменную .

Например:

c:file of integer;

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

AssignFile(переменная, имя_файла);

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

Например:

S:=’text.txt’;

assign (f,’d:\tp\tmp\abc.dat’);

Для открытия существующего файла используют процедуру:

Reset(файловая_переменная);

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

Для создания нового файла или удаления информации из существующеего применяют процедуру:

Rewrite(файловая_переменная);

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

CloseFile(файловая_переменная);

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

Write(переменная, список_выражений);

Writeln(переменная,список_выражений);

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

Процедура Writeln в конце каждой строки добавляет символ «окончание строки».

ПРИМЕР. Подпрограмма, которая создает на диске D файл abc.txt и записывает в него таблицу умножения.

var f:TextFile; i,j:byte;

assignFile(f,"d:\abc.txt");

for i:=2 to 9 do

for j:= 2 to 9 do

write(f,i,"*",j,"=",i*j," ");

Чтение данных из файла осуществляется последовательно от начала файла процедурой

Readln(переменная,список_переменных);

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

Процедура Readln после чтения из файла очередного элемента переходит к следующей строке.

Обращение к следующей подпрограмме приведет к тому, что на форме в окне редактирования появится текст из файла D:\abc.txt :

procedure TForm1.Button1Click(Sender: TObject);

a:string; i:integer;

AssignFile(f1,"D:\abc.txt");

for i:=1 to 8 do

Memo1.Lines.Add(a);

Для типизированных файлов так же применимы процедуры чтения и записи

Read(переменная,список_переменных);

Write(переменная,список_выражений);

только типы выражений при записи и чтении должны соответствовать объявленному типу файла. Процедуры Writeln и Readln к типизированным файлам не применяют.

Для перемещения по типизированному файлу используют процедуру:

Seek(переменная, номер);

Эта процедура позволяет перейти к элементу с указанным номером, то есть осуществляет прямой доступ к компонентам файла . При прямом доступе компоненты файла нумеруются от 0 до n-1, где n – число компонентов в файле.

Так же для прямого доступа к компонентам типизированного файла можно применять функции:

filesize(переменная) – возвращает число реальных компонентов в открытом файле, связанном с файловой_переменной (для пустого файла функция вернет 0);

filepos(переменная) – возвращает значение текущей позиции в открытом файле, связанном с файловой переменной (если файл только что открылся, то функция вернет ноль, после прочтения последнего компонента из файла значение функции совпадает со значением filesize, что указывает на достижение конца файла).

Процедура Seek и функции filesize и filepos с текстовыми файлами не работают. Следующие подпрограммы работают как с типизированными, так и с текстовыми файлами:

Rename(переменная,имя_файла)

переименовывает закрытый файл, связанный с файловой переменной, в соответствии с именем указанным в строке имя файла;

Erase(переменная) – удаляет закрытый файла, связанный с файловой переменной;

Eof(переменная) принимает значение истина (true), если достигнут конец файла, связанного с файловой_переменной, и ложь (false) в противном случае;

ПРИМЕР. Подпрограмма, приведенная ниже, работает так. Открывается вещественный файл d:\abc.dat и в него записывается определенное количество вещественных чисел, вычисленных по формуле. Просмотреть созданный файл не возможно, так как информация в нем представлена в двоичных кодах.

procedure TForm1.Button1Click(Sender: TObject);

AssignFile(f,"d:\abc.dat");

n:=StrToInt(Edit1.Text);

for i:=1 to n do

a:= sqr(i)/sqrt(i);

Чтобы убедиться, что запись в файл d:\abc.dat произошла успешно, выведем его значения в окно редактирования:

procedure TForm1.Button1Click(Sender: TObject);

f1:file of real;

AssignFile(f1,"D:\abc.dat");

while not eof (f1) do

Memo1.Lines.Add(FloatToStr(a));

ЗАДАЧА. На диске Е есть файл целых чисел аbc.int , поменять местами его максимальный и минимальный элементы.

Приведенная далее программа работает так. Компоненты файла считываются в массив. Элементы массива выводятся в поле Memo1. Затем происходит поиск минимального и максимального элементов массива и их индексов. Максимальный и минимальный компоненты перезаписываются в файл на соответствующие позиции.

В заключении элементы преобразованного файла выводятся в поле Memo2.

procedure TForm1.Button1Click(Sender: TObject);

f:file of integer;

a:array of integer;

i,nmax,nmin:byte; max,min:integer;

AssignFile(f,"e:\abc.int");

for i:=0 to filesize(f)-1 do

Memo1.Lines.Add(FloatToStr(a[i]));

max:=a; nmax:=0;

min:=a; nmin:=0;

for i:=1 to filesize(f)-1 do

if a[i]>max then

if a[i]

for i:=0 to filesize(f)-1 do

Memo2.Lines.Add(FloatToStr(a[i]));

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

Копирование файлов с помощью .

Для этого нам потребуется вызов всего одной функции, которая выполняет именно копирование файлов. Это функция CopyFile(). У нее три параметра, два из которых обязательны. Вот полный синтаксис.
CopyFile("путь до начального файла","Путь куда надо копировать",Перезаписывать или нет)

Пример: CopyFile("D:sekretBD.txt","C: ame.txt", true);

В первом параметре можно указывать не только полный путь до файла. Если укажем, например, такой путь "sekretBD.txt", то наша программа будет искать этот файл в своем каталоге. Имя и разрешение нужно указывать именно такими, какие они есть у файла, иначе программа просто не найдет файл.
Во втором параметре тоже можно указывать относительный путь и там вы можете указать имя и расширение файла такое, какое захотите. Т.е. с помощью этой функции можно делать и переименовывание тоже.
Третий параметр отвечает за перезапись файла. Если мы укажем true, то файл не будет перезаписан, а если false, то программа перезапишет файл.

Переименование файлов с помощью

За переименование файлов отвечает функция RenameFile(). У нее 2 параметра. Вот ее полный синтаксис
RenameFile("путь до файла","новое имя");
Честно говоря, синтаксис этой функции меня не особо радует. В нем тоже в обоих параметрах надо указывать полный путь. Т.е. если мы, например, напишем так

RenameFile("C:2.txt","3.txt");

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

Удаление файлов с помощью

Ну здесь все совсем просто. Функция, с помощью которой можно удалить файл, вызывается так:

DeleteFile("C:myprofile.txt");

Единственное, что она не всегда 100% удаляет файл. Когда файл защищен, она его не сможет удалить.

Работа с типизированными файлами в

Что такое типизированный файл? Это файл с определенной структурой. Обычно это структурой выступают записи и базовые типы. В общем, важно, чтобы у типа был известен фиксированный размер, поэтому тип string применять нельзя, нужно делать так: String[N].
Вначале нам нужно объявить переменную, где будут храниться данные из файла. Делается это так:

Var f: file of <Тип>
Например, f: file of string;

Затем нам нужно соединиться с файлом. Для этого есть команда AssignFile. Для вызова надо прописать два параметра, это переменная, которую мы объявили выше и путь до файла. Например

AssignFile(f,"C:delphi.ini");

Теперь файл нужно открыть. Можно открыть двумя способами: с перезатиранием и без. Метод Rewrite открывает файл, предварительно создав его. Т.е. если файла в указанном нами пути не будет находиться, то он его создаст. Если там уже был такой файл, то он будет удален и заново создастся чистый файл. Метод Reset открывает файл и ставит указатель в самое начало файла. Но этот метод опасен тем, что если файла, указанного в подключении, нет, то программа вылетит с ошибкой. Так что для правильного применения функции Reset надо сказать компилятору об отключении ошибок. Задается это директивой {$I-} т.е. полный синтаксис функции reset будет таким:

{$I-}
Reset(f);
{$I+}

После этого надо проверить, был ли открыт файл или нет. Это можно сделать с помощью функции IOResult. Если она не равна нолю, то все успешно.
Полный синтаксис:

{$I-}
Reset(f);
{$I+}
If IOresult <> 0 then <ваш код>

Также осуществить проверку поможет функция FileExists. В ней нужно указать путь до файла.
Для чтения файла служит функция Read(), в которой указываются два параметра: переменная файла и тип записи, в нашем случае это string. Синтаксис:

Для записи в файл служит функция Write(), в которой указываются такие же два параметра: переменная файла и тип записи, в нашем случае это string. Синтаксис:

While not eof(f) do
Read(f,String);

Также есть функция seek, с помощью которой мы можем перейти на интересующую нас запись. Например, нам нужно обратиться к 20 записи и мы делаем так:

Еще есть функция truncate, С помощью которой мы можем удалить все записи файла, начиная от позиции указателя. Позицию можно указать с помощью функции seek, кто не понял.

После выполнения всех операций с файлом, необходимо его закрыть с помощью функции CloseFile(f);
Вот и все. На этом урок закончен. До встречи на сайте!

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

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

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

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

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

Запись в текстовый файл Delphi

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

Для работы с текстовыми документами применяется тип TextFile, который записывается так:

Var Переменная: Тип TextFile;
Для получения доступа к файлу следует воспользоваться процедурой AssignFile() . После того, как доступ к файлу получен, его можно открыть при помощи процедур Reset, Rewrite . Если говорить более подробно, то процедура Reset() открывает ранее созданный документ, а процедура Rewrite() позволяет создать новый файл или же очистить существующий. Закрывается файл при помощи специальной процедуры CloseFile. Осуществить запись в текстовый файл Delphi можно при помощи таких процедур, как Write или WriteLn.

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

1) Направление выходного потока вашей программы в файл.
2) Направление выходного потока вашей программы на принтер.
3) Чтение из входного файла.

Направление выходного потока вашей программы в файл

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

Просто в Delphi ....


Направление выходного потока вашей программы на принтер

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


Чтение из входного файла

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


В Паскале...


{НАЧАЛО INFILE.TXT} 2 Здравствуй, мир Моя программа работает, и этот текст доказательство этому. {КОНЕЦ INFILE.TXT} Для получения дополнительной информации обратитесь к Руководству Разработчика. Ознакомьтесь с описанием функций AssignFile, Assign, Reset, Rewrite, readln, writeln, Close, CloseFile.