Как убедиться, что файл был сохранен на USB-накопителе, когда пользователь не использует "Безопасное извлечение оборудования"?

Когда я сохраняю файл на USB-устройстве в своем приложении delphi, как я могу убедиться, что файл действительно (постоянно) сохранен на USB-накопителе, когда "Безопасное удаление оборудования" не выполняется (особенно забыто использовать)? < ш > Говорить, что наш клиент использует функцию Windows, "Безопасное удаление оборудования" не работает.
Есть ли команда API окон для сброса буфера, чтобы все данные записывались на USB-накопитель постоянно?

Ответ 1

Здесь функция, которую я использовал для очистки данных до 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;

Ответ 2

Когда вы открываете файл, укажите "write through" (флаг FILE_FLAG_WRITE_THROUGH для CreateFile()). Это заставит ОС напрямую записать файл. В кэше ОС все еще может ускорить последующие чтения, но это не проблема для вас.

Если вы хотите сбросить файловые буферы, конечно, всегда FlushFileBuffers()

Ответ 3

что бы ни случилось, вы можете отключить устройство самостоятельно, я имею в виду программно. то вы полностью убедитесь, что они правильно удалили устройство.

посмотрите ответы на этот вопрос: safe-remove-usb-drive-using-win32-api. особенно эта ссылка на статью msdn kb, приведенную в ответе.