Класс TFileStream
Класс TFileStream позволяет создать поток для работы с файлами. При этом поток работает с файлом без учета типа хранящихся в нем данных (см. выше).
Полное имя файла задается в параметре FileName при создании потока:
constructor Createfconst FileName: string; Mode: Word);
Параметр Mode определяет режим работы с файлом. Он составляется из флагов режима открытия:
- fmCreate – файл создается;
- fmOpenRead – файл открывается для чтения;
- fmopenwrite – файл открывается для записи;
- fmOpenReadWrite – файл открывается для чтения и записи.
И флагов режима совместного использования:
- fmShareExciusive – файл недоступен для открытия другими приложениями;
- fmShareDenyWrite – другие приложения могут читать данные из файла;
- fmShareDenyRead – другие приложения могут писать данные в файл;
- fmShareDenyNone – другие приложения могут производить с файлом любые операции.
Для чтения и записи из потока используются методы Read и write, унаследованные от класса THandleStream:
procedure TForml.CopyBtnClick(Sender: TObject); var Streaml, Stream2: TFileStream; IntBuf: array[0..9] of Integer/begin if Not OpenDlg.Execute then Exit; try Streaml: = TFileStream.Create(OpenDlg.FileName, fmOpenRead); Streaml.ReadBuffer(IntBuf, SizeOf(IntBuf)); try Stream2: = TFileStream.Create('TextFile.tmp', fmOpenWrite); Stream2.Seek(0, soFromEnd); Stream2.WriteBuffer(IntBuf, SizeOf(IntBuf)); finally Stream2.Free; end; finally Streaml.Free; end; end;
Обратите внимание, что в данном фрагменте кода функция seek используется для записи данных в конец файлового потока.
При необходимости копирования одного файла в другой целиком используется метод CopyFrom, унаследованный от класса Tstream:
procedure TForml.CopyBtnClick(Sender: TObject); var Streaml, Stream2: TFileStream; begin if Not OpenDlg.Execute then Exit; try Stream1: = TFileStream.Create(OpenDlg.FileName, fmOpenRead); Stream2: = TFileStream.Create('Sample.tmp1, fmOpenWrite); Stream2.Seek{0, soFromEnd); Stream2.CopyFrom(Streaml, Streaml.Size); finally Streaml.Free; Stream2.Free; end; end;
Обратите внимание, что в данном случае идя определения размера передаваемого потока необходимо использовать свойство stream, size, которое дает реальный объем данных, содержащихся в потоке. Функция sizeof (stream) в этом случае даст размер объекта потока, и не более того.