- Код: Выделить всё
- 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



