delphiアプリケーション内のUSBにファイルを保存する場合、「ハードウェアの安全な取り外し」が実行されていない(特に使用を忘れている)ときに、ファイルが実際に(永続的に)USBに保存されていることを確認するにはどうすればよいですか?
Windows機能「ハードウェアの安全な取り外し」を使用するようにお客様に指示しても機能しません。
すべてのデータが永続的にUSBドライブに書き込まれるように、バッファーをフラッシュするWindows APIコマンドはありますか?
4365 次
3 に答える
11
ファイルを開くときに、「ライトスルー」を指定します(CreateFile()へのFILE_FLAG_WRITE_THROUGHフラグ)。これにより、OSはファイルを直接書き出すように強制されます。後続の読み取りを高速化するためにOSキャッシュに残っている可能性がありますが、それは問題ではありません。
ファイルバッファをフラッシュしたい場合は、もちろん常にFlushFileBuffers()があります
于 2009-10-28T10:13:49.640 に答える
4
これは、プログラムでデータを取り出す前にUSBドライブにデータをフラッシュするために使用した関数です。これは、MarkRussinovichの「同期」ユーティリティから機能を複製します。私はこのコードに問題はなく、2、3年の間多くのシステムで実行されています。
このコードの最も関連性のある部分は、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;
于 2009-10-28T13:44:29.637 に答える
2
何が起こっても、自分でデバイスのプラグを抜くことができます。つまり、プログラムで行うことができます。そうすれば、彼らがデバイスを適切に取り外したことを完全に確信できます。
この質問に対する答えを見てください:safe-remove-usb-drive-using-win32-api。特に、回答に記載されているmsdnkbの記事へのこのリンク。
于 2009-10-28T09:13:03.643 に答える