当我在delphi应用程序中的USB上保存文件时,如果没有执行“安全删除硬件”(特别是忘记使用),如何确保文件真正(永久)保存在USB上?
告诉我们的客户使用Windows功能“安全删除硬件”不起作用。
是否有一个Windows API命令来刷新缓冲区,以便所有数据永久写入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()
无论发生什么,你都可以自己拔掉设备,我的意思是以编程方式。那么你将完全确定他们已正确删除了设备。
看看这个问题的答案: 使用-Win32的API安全去除的-USB驱动器,。特别 这个链接到msdn kb文章 在答案中给出。