如何确保文件永久保存在USB上,当用户不使用“安全删除硬件”?
题
当我在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文章的链接在答案中。
不隶属于 StackOverflow