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

Процедурные программы могут быть более простыми для определенного типа программы. Как правило, это короткие подобные сценарию программы.

11
задан Harriv 28 October 2009 в 10:06
поделиться

3 ответа

Вот функция, которую я использовал для записи данных на 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;
3
ответ дан 3 December 2019 в 07:38
поделиться

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

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

2
ответ дан 3 December 2019 в 07:38
поделиться

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

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

11
ответ дан 3 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: