Шаг 87.
Общие средства для работы с файлами

    На этом шаге мы перечислим общие средства для работы с файлами.

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

    AssignFile (f, 'MyFile.Dat');

   


    В обычных Delphi-приложениях вместо Assign и Close должны пользоваться соответственно AssignFile и CloseFile.


    В приведенном примере выполняется связывание логическое файла 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.

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




Предыдущий шаг Содержание Следующий шаг