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

mar*_*_ja 11 windows delphi usb winapi flush

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

MSa*_*ers 11

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

如果你确实想要刷新文件缓冲区,那么当然总是FlushFileBuffers()

  • 肯,你让它听起来像FlushFileBuffers将在实际完成刷新文件缓冲区之前返回.那是对的吗?如果是这样,那么*程序应该如何计算需要等待多长时间? (3认同)

Mic*_*ick 4

这是我用来在以编程方式弹出数据之前将数据刷新到 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)

  • 那是刷新卷上所有打开的文件。如果 Max 只关心他的程序正在写入的文件,而不关心用户可能通过其他方式写入驱动器的任何其他文件,那么他可能只需刷新文件的句柄,而不是刷新整个卷,并且因此他不需要管理权限。 (2认同)