ユーザーが“ハードウェアの安全な取り外し”を使用しないときに、ファイルがUSBに永久に保存されたことを確認する方法
質問
デルファイアプリケーション内でUSBにファイルを保存する場合、「ハードウェアの安全な取り外し」時に、ファイルが実際に(永続的に)USBに保存されていることを確認するにはどうすればよいですか?実行されない(特に使用するのを忘れた)?
Windowsの機能「ハードウェアの安全な取り外し」を使用するようにお客様に伝えます。動作しません。
すべてのデータがUSBドライブに永続的に書き込まれるように、バッファーをフラッシュするWindows APIコマンドはありますか?
解決
これは、プログラムでデータを取り出す前にデータを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;
他のヒント
ファイルを開くときに、「ライトスルー」を指定します(CreateFile()へのFILE_FLAG_WRITE_THROUGHフラグ)。これにより、OSがファイルを直接書き出すようになります。後続の読み取りを高速化するために、OSキャッシュに残っている場合がありますが、それは問題ではありません。
ファイルバッファーをフラッシュする場合は、当然 FlushFileBuffers()が常に存在します
何が起きても、自分でプログラムを抜くことができます。デバイスが適切に削除されたことを完全に確認できます。
この質問の回答をご覧ください: safe-remove-usb -drive-using-win32-api 。特に msdn kb記事へのこのリンク答えに。