На этом шаге мы перечислим общие средства для работы с файлами.
Для работы с каким-либо физическим файлом, находящимся на диске, необходимо первоначально связать его с файловой переменной (логическим файлом), с помощью которой будет осуществляться доступ к этому физическому файлу. Связывание логического и физического файлов выполняется процедурой AssignFile, которая может использоваться только для закрытого файла. Первым параметром этой процедуры является файловая переменная, а вторым параметром - строковая константа или идентификатор строковой переменной, значением которых должно быть имя физического файла:
AssignFile (f, 'MyFile.Dat');
В приведенном примере выполняется связывание логическое файла f с физическим файлом MyFile.Dat, при условии, что он находится в текущем каталоге активного диска. Если же требуется, чтобы действие процедуры AssignFile не зависело от текущих устройств, то записывается полное имя файла с указанием диска, пути каталогов и имени файла, например:
Name := 'a:\MyFiles\MyFile.Dat'; AssignFile (f, Name);
Перед выполнением каких-либо операций чтения и записи в файлах, эти файлы должны быть открыты.
Открытие файлов выполняется процедурами Reset и Rewrite, а закрытие - процедурой CloseFile.
Reset (f) ; Rewrite (f); CloseFile (f);
Процедура Reset открывает существующий физический файл, который был связан с файловой переменной f. Если f - текстовый файл, то он будет доступен только для чтения при последовательном доступе к элементам, если f - типизированный файл, то он будет открыт и для чтения, и для записи как при последовательном доступе, так и при прямом. При открытии указатель текущей позиции файла устанавливается в его начало.
Если физический файл с указанным именем отсутствует, то возникает ошибка времени исполнения, которую можно подавить выключением директивы компилятора {$I-}. При такой установке директивы можно проанализировать результат завершения операции открытия файла с помощью функции IOResult, которая возвращает значение 0, если операция завершилась успешно, и ненулевой код ошибки в противном случае.
Процедура Rewrite создает новый физический файл, имя которого связано с файловой переменной f. Если такой физический файл уже существует, то он удаляется, и на его месте создается новый пустой файл. При открытии указатель текущей позиции в файле устанавливается в его начало.
Еще одной функцией, используемой практически во всех программах, является функция Eof.
Eof (f);
Функция Eof (f) возвращает значение True, если указатель текущей позиции в файле f находится за последним элементом файла, или, ecли файл пуст. В противном случае она возвращает значение False. В качестве примера рассмотрим задачу вычисления суммы элементов файла MyFile.Dat.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var f : file of Smallint; X,i : Smallint; Summa : Longint; S : string; begin AssignFile (f, 'MyFile.Dat'); Reset(f); {I+} if IOResult <> 0 then begin MessageDlg('Ошибка открытия файла', mtError, [mbOk],0); Halt(1); end; { Вычисление суммы } Summa := 0; i :=0; while not eof(f) do begin Read (f, X); Summa := Summa + X; Str(X:18,S); Memo1.Lines.Add(S); Inc(i); end; Str (Summa:15, S); Edit1.Text := S; CloseFile (f); end; procedure TForm1.FormCreate(Sender: TObject); var f : file of Smallint; X,i : Smallint; begin AssignFile (f, 'MyFile.Dat'); Rewrite(f); for i:=1 to 10 do begin X := i*10; Write(f,X); end; CloseFile (f); end; end.
При выполнении проекта, использующего приведенный модуль будет получен следующий результат:
Рис.1. Результат работы приложения
Для работы с каталогами в модуль System включены процедуры ChDir, MkDir, RmDir и GetDir, которые по смыслу аналогичны командам операционной системы MS-DOS. В качестве примера приведем несколько операторов вызова этих процедур, смысл которых поясняется в комментариях.
{ Установить активным корневой каталог диска Е: } ChDir ('E:\'); { Записать в строку S имена активного диска и каталога. } GetDir(0,S); { Создать подкаталог MyDir. } MkDir ('MyDir'); { Перейти в подкаталог MyDir. } ChDir ('MyDir') ; { Установить активным корневой каталог диска Е: } ChDir('\') ; { Удалить подкаталог MyDir. } RmDir ('MyDir') ;
Процедура Rename служит для переименования физических файлов, процедура Erase - для их удаления. Заметим, что эти процедуры допускается выполнять только для файловых переменных, которые уже связаны с каким-либо физическим файлом, но для которых еще не выполнена операция открытия файла. Следующий фрагмент программы демонстрирует сначала переименование файла MyFile.Dat в Result.Dat, a затем удаление этого файла:
var f : file; begin AssignFile(f,'MyFile.Dat'); Rename(f,'Result.Dat'); {... Действия с переименованным файлом. } CloseFile(f); Erase(f); . . . . end.
На следующем шаге мы рассмотрим средства для работы с типизированными файлами.