如何确保文件永久保存在USB上,当用户不使用“安全删除硬件”?

StackOverflow https://stackoverflow.com/questions/1635947

当我在delphi应用程序中的USB上保存文件时,如何在“安全删除硬件”时确保文件真正(永久)保存在USB上。没有执行(特别是忘记使用)?
告诉我们的客户使用Windows功能“安全删除硬件”不起作用。
是否有一个Windows API命令来刷新缓冲区,以便所有数据永久写入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;

其他提示

当您打开文件时,请指定“直写” (FILE_FLAG_WRITE_THROUGH标志为CreateFile())。这将迫使操作系统直接写出文件。它可能仍然在OS缓存中以加速后续读取,但这对您来说不是问题。

如果你想刷新文件缓冲区,当然总是 FlushFileBuffers()

无论发生什么,你都可以自己拔掉设备,我的意思是以编程方式。那么你将完全确定他们已经正确地移除了设备。

查看此问题的答案: safe-remove-usb -drive-使用-Win32的API 。特别是给出msdn kb文章的链接在答案中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top