Когда я сохраняю файл на USB в моем приложении delphi, как я могу убедиться, что файл действительно (постоянно) сохранен на USB, когда «Безопасное извлечение оборудования» не выполняется (особенно забыто использовать)?
Сообщая наш клиент, использующий функцию Windows «Безопасное извлечение оборудования», не работает.
Есть ли команда Windows API для очистки буфера, чтобы все данные постоянно записывались на USB-накопитель?
Как сделать так, чтобы файл был постоянно сохранен на USB, если пользователь не использует Safely Remove Hardware?
Ответы (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;
Когда вы открываете файл, укажите «сквозную запись» (флаг FILE_FLAG_WRITE_THROUGH для CreateFile ()). Это заставит ОС записать файл напрямую. Он может все еще находиться в кеше ОС для ускорения последующих чтений, но для вас это не проблема.
Если вы действительно хотите очистить файловые буферы, конечно, всегда есть FlushFileBuffers ()
что бы ни случилось, вы можете отключить устройство самостоятельно, я имею в виду программно. тогда вы будете полностью уверены, что они сняли устройство правильно.
посмотрите ответы на этот вопрос: safe-remove-usb-drive- using-win32-api. особенно эту ссылку на статью msdn kb, указанную в ответ.