12

当我在我的 delphi 应用程序中将文件保存在 USB 上时,当未执行“安全删除硬件”(尤其是忘记使用)时,如何确保文件确实(永久)保存在 USB 上?
告诉我们的客户使用 Windows 功能“安全删除硬件”不起作用。
是否有 Windows API 命令来刷新缓冲区,以便将所有数据永久写入 USB 驱动器?

4

3 回答 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 回答