Для файла на диске является функцией Win32 FlushFileBuffers как надежный и уверенный как закрытие использования файла CloseHandle, затем вновь открывший использование файла CreateFile?
Есть ли обстоятельства, где CloseHandle затем CreateFile лучше, потому что они сохраняют данные правильно к диску, когда FlushFileBuffers не делает?
Лучше, CloseHandle () не очищает буферы записи кэша файловой системы. Остерегайтесь затрат: передача данных на диск может занять много времени. Параметр FILE_FLAG_NO_BUFFERING для CreateFile позволяет избежать сброса. Но это очень дорого и сложно получить правильно из-за ограничений записываемых данных.
Согласно документации, FlushFileBuffers все записывает на диск. Однако, наверное, не помешает проверить это самостоятельно. Я проводил тестирование BRS (большой красный переключатель ... ну, раньше на ПК были большие красные переключатели), и я обнаружил, что он действительно заставлял писать все. После вызова FlushFileBuffers выключите ПК без полного выключения. Включите его снова и посмотрите, есть ли все данные. Поведение может измениться в зависимости от ОС (теоретически не должно ... но мало ли). Некоторое время назад я проводил подобные тесты (это было на XP или, возможно, даже на Windows 2000).
Я полагаю, это само собой разумеется, но вы, вероятно, не захотите проводить это тестирование на рабочей станции, которая вам действительно небезразлична.
Хотя эта информация не относится к Delphi, но самая распространенная SQL-база данных на земле, sqlite (используемая, например, в Firefox) заботится о таких вещах, и вы можете прочитать много об атомарных операциях здесь: http://www.sqlite.org/atomiccommit.html Ниже приведена цитата из статьи о FlushFileBuffers
9.2 Неполная очистка диска
SQLite использует системный вызов fsync() на Unix и FlushFileBuffers
. Unix и системный вызов FlushFileBuffers() на w32 для того, чтобы синхронизировать буферы файловой системных буферов на дисковый оксид, как показано в шаге 3.7 и шаге 3.10. К сожалению, мы получили сообщения о том, что ни один из этих интерфейсов не работает так, как рекламируется на многих системах. Мы слышали, что FlushFileBuffers() может быть полностью отключить с помощью параметров реестра в некоторых версиях Windows. ...