Информационные технологииStfw.Ru 🔍

Класс TFileStream

ГЛАВА 9. Файлы и устройства ввода/вывода
🕛 14.11.2006, 18:42
Класс 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

Streaml := 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) в этом случае даст размер объекта потока, и не более того.

Cамоучитель по Delphi   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉