バイナリ ファイルを本当に高速に読み取りたい場合は、Windows にバッファリングを心配させてください ;-) Memory Mapped Filesを使用します。これを使用すると、ファイルをメモリの場所に単純にマップして、配列のように読み取ることができます。
関数は次のようになります。
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
ますが、パラメーターで var として渡すか、結果の配列を返す関数を使用します。
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 は、私の記事Fast reading of files using Memory Mappingからのものです。この記事には、より「高度な」バイナリ ファイルに使用する方法の例も含まれています。