我需要直接從驅動器讀取文件,而無需任何系統緩衝。我在這裏嘗試了這段代碼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; –