Теперь рассмотрим две самые распространенные операции, выполняемые при работе с файлами. Это чтение и запись. Для их осуществления применяются специальные функции файлового ввода/вывода.
Итак, для выполнения операции чтения или записи необходимо произвести следующие действия:
1. Объявить файловую переменную необходимого типа.
2. При помощи функции AssignFile связать эту переменную с требуемым файлом.
3. Открыть файл при помощи функций Append, Reset, Rewrite.
4. Выполнить операции чтения или записи. При этом, в зависимости от сложности задачи и структуры данных, может использоваться целый ряд вспомогательных функций.
5. Закрыть файл при помощи функции CloseFile.
Внимание
По сравнению с Turbo Pascal изменились названия только двух функций: Assign стала AssignFile, a Close превратилась в CloseFile.
В качестве примера рассмотрим небольшой фрагмент исходного кода.
...
var F: TextFile;
S: string;
begin
if OpenDlg.Execute
then AssignFiie(F, OpenDlg.FileName)
else Exit; Reset(F);
while Not EOF(F) do
begin
Readln(F, S) ;
Memo.Lines.Add(S);
end;
CloseFile(F);
end;
...
Если в диалоге открытия файла OpenDlg был выбран файл, то его имя связывается с файловой переменной F при помощи процедуры AssignFiie. В качестве имени файла рекомендуется всегда передавать полное имя файла (включая его маршрут). Как раз в таком виде возвращают результат выбора файла диалоги работы с файлами TOpenDialog, TOpenPictureDiaiog. Затем при помощи процедуры Reset этот файл открывается для чтения и записи.
В цикле выполняется чтение из файла текстовых строк и запись их в компонент TMemo. Процедура Readin осуществляет чтение текущей строки файла и переходит на следующую строку. Цикл выполняется, пока функция EOF не сообщит о достижении конца файла.
После завершения чтения файл закрывается.
Такой же исходный код можно использовать и для записи данных в файл. Необходимо только заменить процедуру чтения на процедуру записи.
Теперь остановимся подробнее на назначении используемых для файлового ввода/вывода функций.
|
Объявление
|
Описание
|
|
function ChangeFileExt (const FileName, Extension: string): string;
|
Функция позволяет изменить расширение файла. При этом сам файл не переименовывается |
|
procedure ChDir(S: string);
|
Процедура изменяет текущий каталог на другой, путь к которому описан в строке s |
|
procedure CloseFile (var F) ;
|
Вызов процедуры разрывает связь между файловой переменной и файлом на диске. Имя этой процедуры изменено из-за конфликта имен в Delphi (в Borland Pascal используется процедура Close) |
|
function DeleteFile (const FileName: string): Boolean;
|
Функция производит удаление файла FileName с диска и возвращает значение False, если файл удалить не удалось или файл не существует |
function ExtractFileExt (const FileName: string): string;
|
Функция возвращает расширение файла |
|
function ExtractFileName (const FileName: string) : string;
|
Извлекает имя и расширение файла, содержащегося в параметре FileName
|
|
function ExtractFilePath( const FileName: string): string;
|
Функция возвращает полный путь к файлу |
|
procedure Erase (var F);
|
Удаляет файл, связанный с файловой переменной F
|
|
function FileSearch (const Name, DirList: string) : string;
|
Данная процедура производит поиск в каталогах DirList файла Name. Если в процессе выполнения FileSearch обнаруживается искомое имя файла, то функция возвращает в строке типа string полный путь к найденному файлу. Если файл не найден, то возвращается пустая строка |
|
function FileSetAttr (const FileName: string; Attr: Integer): Integer;
|
Присваивает файлу с именем FileName атрибуты Attr. Функция возвращает 0, если присвоение атрибутов прошло успешно. В противном случае возвращается код ошибки |
|
function FilePos (var F): Longint;
|
Возвращает текущую позицию файла. Функция используется для нетекстовых файлов. Перед вызовом FilePos файл должен быть открыт |
|
function FileSize (var F): Integer;
|
FileSize возвращает размер файла в байтах или количество записей в файле, содержащем записи. Перед вызовом данной функции файл должен быть открыт. Для текстовых файлов функция FileSize не используется |
|
procedure Flush (var F: Text);
|
Процедура очищает буфер текстового файла, открытого для записи. F— файловая переменная. Когда текстовый файл открыт для записи с использованием функции Rewrite или Append, Flush очищает выходной буфер, связанный с файлом. После выполнения данной процедуры все символы, которые направлены для записи в файл, будут гарантированно записаны в нем |
procedure GetDir(D: Byte; var S: string);
|
Возвращает число, соответствующее диску, на котором содержится текущий каталог s. о может принимать одно из следующих значений:
Процедура не генерирует код ошибки. Если имя диска в D оказывается ошибочным, то в строке S возвращается значение Х:\, как если бы текущая папка была на этом ошибочно указанном диске |
|
function lOResult: Integer;
|
Функция возвращает статус последней произведенной операции ввода/вывода, если контроль ошибок выключен { $1- } |
|
procedure MkDir(S: string);
|
Процедура создает новый каталог, который описывается в строке S |
|
procedure Rename (var F; NewName: string) ;
|
Процедура изменяет имя файла, связанного с файловой переменной F. Переменная NewName является строкой типа string или PChar (если включена поддержка расширенного синтаксиса) |
|
procedure RmDir(S: string);
|
Процедура удаляет пустой каталог, путь к которому задается в строке S. Если указанный каталог не существует или он не пустой, то возникает сообщение об ошибке ввода/вывода |
|
procedure Seek (var F; N: Longint) ;
|
Перемещает текущую позицию курсора на N позиций. Данная процедура используется только для открытых типизированных или нетипизированных файлов для проведения чтения/записи с нужной позиции файла. Началу файла соответствует нулевой номер позиции. Для добавления новой информации в конец существующего файла необходимо установить указатель на символ, следующий за последним. Для этого можно использовать выражение Seek (F, FileSize(F))
|
function SeekEof[(var F: Text) ] : Boolean;
|
Возвращает значение True, если указатель текущей позиции находится на символе конца файла. SeekEof может быть использован только с открытым текстовым файлом |
|
function SeekEoln[ (var F: Text) ] : Boolean;
|
Возвращает значение True, если указатель текущей позиции находится на символе конца строки. SeekEoln может быть использован только с открытым текстовым файлом |
|
procedure SetTextBuf (var F: Text; var Buf [; Size: Integer] );
|
Связывает с текстовым файлом буфер ввода/вывода. F — файловая переменная текстового типа. Каждая файловая переменная текстового типа имеет внутренний буфер емкостью 128 байт, в котором накапливаются данные при чтении и записи. Такой буфер пригоден для большинства операций. Однако при выполнении программ с интенсивным вводом/выводом буфер может переполниться, что приведет к записи операций ввода/вывода на диск и, как следствие, к существенному замедлению работы приложения. SetTextBuf позволяет помещать в текстовый файл F информацию об операциях ввода/вывода вместо ее размещения в буфере. Size указывает размер буфера в байтах. Если этот параметр опускается, то полагается размер, равный SizeOf(Buf). Новый буфер действует до тех пор, пока F не будет связана с новым файлом процедурой AssignFile
|
|
procedure Truncate {var F) ;
|
Удаляет все позиции, следующие после текущей позиции в файле. А текущая позиция становится концом файла. С переменной F может быть связан файл любого типа за исключением текстового |