Для более удобной работы с нетипизированными данными в Delphi введено специальное средство – файловый поток (TFileStream). Объект типа TFileStream включает в себя ряд свойств и методов, необходимых для выполнения основных операций с файлами.
Рассмотрим, например, как скопировать файл, используя потоки:
PROCEDURE CopyF(source, Dest:STRING);
CONST bufsize=100240; // размер буфера
VAR fin, fout:TFileStream; // потоки
i, n:LONGINT;
buf:POINTER; // указатель на буфер
f:FILE OF BYTE;
BEGIN
// создаем поток для чтения
fin:=TFileStream.Create(source,fmOpenRead);
// создаем пустой файл с именем Dest
ASSIGNFILE(f,Dest);
ReWrite(f);
CloseFile(f);
// создаем поток для записи
fout:=TFileStream.Create(DEST,fmOpenWrite);
// выдеяем память под буфер
GetMem(buf,bufsize);
// "перекачиваем" данные из файла в файл
FOR i:=1 TO fin.Size DIV bufsize DO
BEGIN
fin.Read(buf^,bufsize);
fout.Write(buf^,bufsize)
END;
// "перекачиваем" хвост
fin.Read(buf^,fin.Size MOD bufsize);
fout.Write(buf^,fin.Size MOD bufsize);
// убираем из памяти потоки
fin.Free;
fout.Free;
// освобождаем память под буфер
FreeMem(buf, bufsize)
END;
Рассмотрим работу данной процедуры. В ней создаются два файловых потока – fin и fout. При создании следует указать, будет файл, связанный с потоком, открыт для записи (fmOpenWrite) или для чтения (fmOpenRead). При этом файловый поток не умеет создавать новый файл, поэтому пустой файл с именем DEST создается командой ReWrite.
Далее в памяти командой GetMem выделяется область размером bufsize байт, которая используется для "перекачивания" данных из одного файла в другой. Свойство файлового потока Size содержит размер связанного с потоком файла в байтах. Выражение fin.Size DIV bufsize показывает, сколько раз нужно заполнять буфер в памяти значениями из входного файла. Метод Fin.Read(v,n) считывает в переменную v n байт из файла, а метод fout.Write(v,n) записывает n байт из переменной v в файл. Выражение fin.Size MOD bufsize позволяет найти "хвост" файла, который не поместился в буфере – его тоже надо считать, а в конце процедуры – освободить память, занятую буфером (команда FreeMem(buf, bufsize)).