Как убедиться, что файл был постоянно сохранен на USB, когда пользователь не использует «Безопасное извлечение устройства»? - PullRequest
11 голосов
/ 28 октября 2009

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

Ответы [ 3 ]

11 голосов
/ 28 октября 2009

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

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

3 голосов
/ 28 октября 2009

Вот функция, которую я использовал для сброса данных на USB-накопитель перед его программным извлечением. Это клонирует функциональность Утилиты Марка Руссиновича "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 голосов
/ 28 октября 2009

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

взгляните на ответы на этот вопрос: safe-remove-usb-drive-using-win32-api . особенно эта ссылка на статью MSDN KB приведена в ответе.

...