当我在我的 delphi 应用程序中将文件保存在 USB 上时,当未执行“安全删除硬件”(尤其是忘记使用)时,如何确保文件确实(永久)保存在 USB 上?
告诉我们的客户使用 Windows 功能“安全删除硬件”不起作用。
是否有 Windows API 命令来刷新缓冲区,以便将所有数据永久写入 USB 驱动器?
问问题
4365 次
3 回答
11
当您打开文件时,指定“直写”(FILE_FLAG_WRITE_THROUGH 标志到 CreateFile())。这将强制操作系统直接写出文件。它可能仍在操作系统缓存中以加快后续读取速度,但这对您来说不是问题。
如果你确实想刷新文件缓冲区,当然总是有FlushFileBuffers()
于 2009-10-28T10:13:49.640 回答
4
这是我用来在以编程方式弹出 USB 驱动器之前将数据刷新到 USB 驱动器的函数。这克隆了Mark Russinovich 的“同步”实用程序的功能。我对这段代码没有任何问题,它已经在很多系统上运行了几年。
这段代码最相关的部分是对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;
于 2009-10-28T13:44:29.637 回答
2
无论发生什么,您都可以自己拔下设备,我的意思是通过编程方式。那么您将完全确定他们已正确移除设备。
看看这个问题的答案:safe-remove-usb-drive-using-win32-api。尤其是答案中给出的 msdn kb 文章的链接。
于 2009-10-28T09:13:03.643 回答