ユーザーが“ハードウェアの安全な取り外し”を使用しないときに、ファイルがUSBに永久に保存されたことを確認する方法

StackOverflow https://stackoverflow.com/questions/1635947

質問

デルファイアプリケーション内で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記事へのこのリンク答えに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top