FlushFileBuffers, столь же хороший как CloseHandle затем CreateFile при сохранении на диск данных?

Для файла на диске является функцией Win32 FlushFileBuffers как надежный и уверенный как закрытие использования файла CloseHandle, затем вновь открывший использование файла CreateFile?

Есть ли обстоятельства, где CloseHandle затем CreateFile лучше, потому что они сохраняют данные правильно к диску, когда FlushFileBuffers не делает?

5
задан soid 8 July 2010 в 15:03
поделиться

3 ответа

Лучше, CloseHandle () не очищает буферы записи кэша файловой системы. Остерегайтесь затрат: передача данных на диск может занять много времени. Параметр FILE_FLAG_NO_BUFFERING для CreateFile позволяет избежать сброса. Но это очень дорого и сложно получить правильно из-за ограничений записываемых данных.

7
ответ дан 13 December 2019 в 22:01
поделиться

Согласно документации, FlushFileBuffers все записывает на диск. Однако, наверное, не помешает проверить это самостоятельно. Я проводил тестирование BRS (большой красный переключатель ... ну, раньше на ПК были большие красные переключатели), и я обнаружил, что он действительно заставлял писать все. После вызова FlushFileBuffers выключите ПК без полного выключения. Включите его снова и посмотрите, есть ли все данные. Поведение может измениться в зависимости от ОС (теоретически не должно ... но мало ли). Некоторое время назад я проводил подобные тесты (это было на XP или, возможно, даже на Windows 2000).

Я полагаю, это само собой разумеется, но вы, вероятно, не захотите проводить это тестирование на рабочей станции, которая вам действительно небезразлична.

2
ответ дан 13 December 2019 в 22:01
поделиться

Хотя эта информация не относится к 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. ...

1
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: