- Код: Выделить всё
function TMain.Open(const aFileName: TFilename): boolean;
var
FS: TFileStream;
b: Byte;
begin
Result := False;
// Открытие файла
FS := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyWrite);
try
FS.Seek(0, soFromBeginning);
while FS.Position < FS.Size do begin
b := FS.ReadByte;
// Обработка
end;
finally
FS.Free;
end;
Result := True;
end;
В итоге просто побайтное чтение файла размером 30Мб заняло больше часа и это без какой либо обработки!!!
Для ускорения решил сделать через буфер:
- Код: Выделить всё
function TMain.Open(const aFileName: TFilename): boolean;
const
BufSize = 1024 * 512;
var
FS: TFileStream;
Buf: array of Byte;
i, rb: Integer;
b: Byte;
begin
Result := False;
fFN := aFileName;
// Открытие файла
FS := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyWrite);
try
SetLength(Buf, BufSize);
FS.Seek(0, soFromBeginning);
while FS.Position < FS.Size do begin
rb := FS.Read(Buf, BufSize);
i := 0;
while i < rb do begin
b := Buf[i];
// Обработка
Inc(i);
end;
end;
finally
FS.Free;
end;
Result := True;
end;
А тут вообще впадает в бесконечный цикл, так как метод Read возвращает 0 и в буфер ничего не пишется, и соответственно Position не смещается. Как победить???
Lazarus 1.0 x64 Win7 x64