代码之家  ›  专栏  ›  技术社区  ›  markus_ja

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

  •  11
  • markus_ja  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Mick    15 年前

    这是一个函数,我用它在程序弹出数据之前将数据刷新到一个USB驱动器。此克隆功能来自 Mark Russinovich's "Sync" utility . 我对这段代码没有任何问题,它已经在很多系统上运行了几年。

    此代码最相关的部分是调用 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;
    
        2
  •  11
  •   MSalters    15 年前

    打开文件时,请指定“写入”(file_flag_write_through flag to createfile())。这将强制操作系统直接写出文件。它可能仍然在OS缓存中以加速后续读取,但这对您来说不是问题。

    如果您确实想刷新文件缓冲区,那么 FlushFileBuffers()

        3
  •  2
  •   Community CDub    8 年前

    不管发生什么,你可以自己拔掉设备的插头,我的意思是编程。然后您将完全确定他们已正确地卸下设备。

    看看这个问题的答案: safe-remove-usb-drive-using-win32-api . 尤其地 this link to a msdn kb article 在答案中给出。