12

delphiアプリケーション内のUSBにファイルを保存する場合、「ハードウェアの安全な取り外し」が実行されていない(特に使用を忘れている)ときに、ファイルが実際に(永続的に)USBに保存されていることを確認するにはどうすればよいですか?
Windows機能「ハードウェアの安全な取り外し」を使用するようにお客様に指示しても機能しません。
すべてのデータが永続的にUSBドライブに書き込まれるように、バッファーをフラッシュするWindows APIコマンドはありますか?

4

3 に答える 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 に答える