MSa*_*ers 11
打开文件时,请指定"直写"(FILE_FLAG_WRITE_THROUGH标志为CreateFile()).这将迫使操作系统直接写出文件.它可能仍然在OS缓存中以加速后续读取,但这对您来说不是问题.
如果你确实想要刷新文件缓冲区,那么当然总是FlushFileBuffers()
这是我用来在以编程方式弹出数据之前将数据刷新到 USB 驱动器的函数。这克隆了Mark Russinovich 的“Sync”实用程序的功能。我对这段代码没有任何问题,并且它已经在很多系统上运行了几年。
此代码最相关的部分是对FlushFileBuffers的调用。
function FlushToDisk(sDriveLetter: string): boolean;
var
hDrive: THandle;
S: string;
OSFlushed: boolean;
bResult: boolean;
begin
bResult := False;
S := '\\.\' + sDriveLetter + ':';
//NOTE: this may only work for the SYSTEM user
hDrive := CreateFile(PAnsiChar(S), GENERIC_READ or
GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
OSFlushed := FlushFileBuffers(hDrive);
CloseHandle(hDrive);
if OSFlushed then
begin
bResult := True;
end;
Result := bResult;
end;
Run Code Online (Sandbox Code Playgroud)