システムバッファリングなしでドライブから直接ファイルを読み込む必要があります。私はここでこのコードを試しましたHow to unload a file from cache?残念なことに、私は "メモリストリームを拡張中にメモリが足りない"というエラーメッセージを受け取ります。私が試したどのファイルでも起こります。後で私は、SrcStream.Sizeが常に値-1を返すことに気付きました。だから、明らかに問題はここにあり、なぜこのようなことが起こっているのでしょうか?"メモリストリーミングを拡張中にメモリが不足しています"
uses
MMSystem;
function GetTimeForRead(ABuffered: boolean): single;
const
FileToRead = // name of file with maybe 500 MByte size
var
FlagsAndAttributes: DWORD;
FileHandle: THandle;
SrcStream, DestStream: TStream;
Ticks: DWord;
begin
if ABuffered then FlagsAndAttributes := FILE_ATTRIBUTE_NORMAL
else FlagsAndAttributes := FILE_FLAG_NO_BUFFERING;
FileHandle := CreateFile(FileToRead, GENERIC_READ, FILE_SHARE_READ, nil,OPEN_EXISTING, FlagsAndAttributes, 0);
if FileHandle = INVALID_HANDLE_VALUE then
begin
Result := 0.0;
exit;
end;
SrcStream := THandleStream.Create(FileHandle);
try
DestStream := TMemoryStream.Create;
try
DestStream.Size := SrcStream.Size;
Ticks := timeGetTime;
DestStream.CopyFrom(SrcStream, SrcStream.Size);
Result := 0.001 * (timeGetTime - Ticks);
finally
DestStream.Free;
end;
finally
SrcStream.Free;
end;
end;
私は、問題はすぐそこにあることがわかります。私の指がどこを指しているのか分かりますか? –
目に見えない指が目に見えないコードを指していますか?うわー、このインターネットのことは本当にクールです。 –
このエラーメッセージは FlagsAndAttributesに表示されません:= FILE_ATTRIBUTE_NORMAL しかし、それは常に FlagsAndAttributesでクラッシュ:= FILE_FLAG_NO_BUFFERING。 –