Если вы действительно хотите быстро читать двоичный файл, позвольте Windows беспокоиться о буферизации ;-), используя Файлы с отображением в памяти . Используя это, вы можете просто отобразить файл в ячейку памяти для чтения, как будто это массив.
Ваша функция станет:
procedure openfile(fname:string);
var
InputFile: TMappedFile;
begin
InputFile := TMappedFile.Create;
try
InputFile.MapFile(fname);
SetLength(dataarray, InputFile.Size);
Move(PByteArray(InputFile.Content)[0], Result[0], InputFile.Size);
finally
InputFile.Free;
end;
end;
Но я бы предложил не использовать глобальную переменную dataarray
, а либо передать ее как переменную в параметре, либо использовать функцию, которая возвращает полученный массив.
procedure ReadBytesFromFile(const AFileName : String; var ADestination : TByteArray);
var
InputFile : TMappedFile;
begin
InputFile := TMappedFile.Create;
try
InputFile.MapFile(AFileName);
SetLength(ADestination, InputFile.Size);
Move(PByteArray(InputFile.Content)[0], ADestination[0], InputFile.Size);
finally
InputFile.Free;
end;
end;
TMappedFile из моей статьи Быстрое чтение файлов с помощью Memory Mapping , эта статья также содержит пример того, как использовать его для более "продвинутых" двоичных файлов.