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