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