Продолжаем рассматривать возможности IOUtils.pas — нового модуля Delphi 2010. Сегодня остановимся на объекте TFile.
TFile предназначен для работы с файлами. Судя по тому, какие меоды предоставляет нам класс TFile, с его использованием возможно, как минимум:
- Создавать/копировать/перемещать файлы;
- Считывать/усанавливать атрибуты файла;
- Читать/записывать данные
- Получать из файла миссив байтов TBytes;
- Получать из файла массив строк;
Что ж, посмотрим как эти операции рализуются на практике.
Как создать новый файл с использованием 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.