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

Продолжаем рассматривать возможности IOUtils.pas — нового модуля Delphi 2010. Сегодня остановимся на объекте TFile.
TFile предназначен для работы с файлами. Судя по тому, какие меоды предоставляет нам класс TFile, с его использованием возможно, как минимум:

  1. Создавать/копировать/перемещать файлы;
  2. Считывать/усанавливать атрибуты файла;
  3. Читать/записывать данные
  4. Получать из файла миссив байтов TBytes;
  5. Получать из файла массив строк;

Что ж, посмотрим как эти операции рализуются на практике.

Как создать новый файл с использованием TFile?

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

class function Create(const Path: string): TFileStream; overload; inline; static;
class function Create(const Path: string; const BufferSize: Integer): TFileStream; overload; static;

В результате получим файловый поток открытый на чтение/запись (с параметром fmShareExclusive). После того, как файл создан, например так:

var FS:TFileStream;
begin
  FS:=TFile.Create('C:/Temp/temp.txt')
end;

мы можем продолжать работать с потоком FS, как и работали до появления IOUtils, либо использовать другие методы класса TFile. Следует, наверное, отметить, что TFile.Create не создает новые директории — только файл, т.е. если папки C:/Temp не существует, то выполнение приведенного выше кода вернет исключение EDirectoryNotFoundException «The specified path was not found». Как создавать новые директории мы рассмотрли в первой части обзора.

Как прочитать/изменить атрибуты файла?

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

class procedure SetAttributes(const Path: string;
        const Attributes: TFileAttributes); inline; static;

В качестве параметров необходимо указать путь к файлу, включая его название (Path) и арибуты (Attributes), которые определены в IOUtils.pas следующим образом:

TFileAttribute = (faReadOnly, faHidden, faSystem, faDirectory, faArchive,
    faDevice, faNormal, faTemporary, faSparseFile, faReparsePoint, faCompressed,
    faOffline, faNotContentIndexed, faEncrypted);
  TFileAttributes = set of TFileAttribute;

Для примера создадим временный скрытый файл, т.е. присвойм файлу атрибуты faTemporary и faHidden. Сделать это можно следующим образом:

var Attrs: TFileAttributes;
     FileStream: TFileStream;
begin
  Attrs:=[];
  Attrs:=Attrs+[TFileAttribute.faHidden,TFileAttribute.faTemporary];
  TFile.Create('path2file/file.tmp');
  TFile.SetAttributes('path2file/file.tmp', Attrs);
end;

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

Attrs:=TFile.GetAttributes('path2file/file.tmp');
if TFileAttribute.faHidden in Attrs then
    ShowMessage('Hidden File!')

Как записать/прочитать данные файла?

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

class procedure AppendAllText(const Path, Contents: string); overload; static;
class procedure AppendAllText(const Path, Contents: string;
        const Encoding: TEncoding); overload; static;
class function AppendText(const Path: string): TStreamWriter; static;
class function CreateText(const Path: string): TStreamWriter; static;
class procedure WriteAllBytes(const Path: string; const Bytes: TBytes); static;
class procedure WriteAllLines(const Path: string;
const Contents: TStringDynArray); overload; inline; static;
class procedure WriteAllLines(const Path: string;
       const Contents: TStringDynArray; const Encoding: TEncoding);  overload; static;
class procedure WriteAllText(const Path, Contents: string); overload; static;
class procedure WriteAllText(const Path, Contents: string;
        const Encoding: TEncoding); overload; static;

Вначале простой пример того, как создать скрытый, временный файл, который будет содержать строку в кодировке UTF-8 (используются только методы из IOUtils.pas):

var FileStream:TFileStream;
begin
  Attrs:=[];
  Attrs:=Attrs+[TFileAttribute.faHidden,TFileAttribute.faTemporary];
  FileStream:=TFile.Create(Edit1.Text);
  TFile.SetAttributes(Edit1.Text,Attrs);
  FileStream.Free;
  TFile.AppendAllText(Edit1.Text,'Строка, которая должна быть в UTF-8',TEncoding.UTF8);
end;

После этого мы получим файл, содержащий строку в кодировке UTF-8. Если Вам недостаточно методов AppendAllText, то можно воспользоваться методами AppendText или CreateText, которы вернут Вам соответственно экземпляры класса TStreamWriter на добавление и создание нового содержимого файлового потока. В следующем примере создается новый файл, в который записывается строка и число (integer) с использованием метода CreateText:

var FW: TStreamWriter;
begin
  FW:=TFile.CreateText(Edit1.Text);
  FW.WriteLine('Строка UTF-8, записанная с помощью TStreamWriter');
  FW.WriteLine(125);
  FW.Free;
end;

Кстати, здесь я показываю только то как работать с целевым методом, т.е. не провожу такой важной операции как проверка на существование файла, в ваших рабочих проектах такая проверка будет необходима.
Что касается оставшихся методов записи данных в файл, то, думаю, что особенных проблем при их использовании быть не должно. Про TStringDynArray я упоминал в первой части — это простой динамический массив строк, а про TBytes — в постах, касающихся работы с кодировками, например, здесь.
Теперь посмотрим, какие метды можно использовать для чтения данных. Здесь все прямопротивоположно записи:

class function OpenText(const Path: string): TStreamReader; static;
class function ReadAllBytes(const Path: string): TBytes; static;
class function ReadAllLines(const Path: string): TStringDynArray;      overload; static;
class function ReadAllLines(const Path: string; const Encoding: TEncoding): TStringDynArray; overload; static;
class function ReadAllText(const Path: string): string; overload; inline; static;
class function ReadAllText(const Path: string; const Encoding: TEncoding): string; overload; inline; static;

Соответственно, OpenText — это метод противоположный методам CreateText и AppendText, то есть, возвращающий нам экземпляр класса TStreamReader для чтения данных из файлового потока.

Чтение информации о датах создания/доступа/изменения файла

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

Что в целом можно отметить по поводу работы с TFile? TFile имеет вполне хорошую юзабельность в отношении работы по чтению/записи данных. Можем просто, без лишних телодвижений получить экземпляры TFileStream, TStreamReader/Writer и т.д. для работы с файлом. Пока писал этот пост попробовал использовать практически все методы работы с файлом: создал файл, записал строку, изменил кодировку, изменил атрибуты, удалил файл и т.д. Никаких проблем пока не заметил. Если Вы сталкивались с проблемами при работе с IOUtils, то буду благодарен за листинг, демонстрирующий «граблю» при работе.

В следующей части мы рассмотрим работу с объектом TPath.

5 2 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии