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