FlushFileBuffers так же хорошо, как CloseHandle, а затем CreateFile при сохранении данных на диск? - PullRequest
5 голосов
/ 08 июля 2010

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

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

Ответы [ 3 ]

6 голосов
/ 08 июля 2010

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

2 голосов
/ 08 июля 2010

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

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

1 голос
/ 09 июля 2010

Хотя эта информация относится не к Delphi, а к самой развернутой базе данных SQL на земле, sqlite (используется, например, в Firefox) позаботится о таких вещах, и вы можете прочитать здесь много атомарных операций: 1002 * Ниже приводится цитата из статьи о FlushFileBuffers

9.2 Неполные сбросы диска

SQLite использует системный вызов fsync () для Unix и система FlushFileBuffers () позвоните на w32 для синхронизации файла система буферизирует на оксид диска как показано в шаге 3.7 и шаге 3.10. К сожалению, мы получили сообщает, что ни один из этих Интерфейсы работают так, как рекламируется на многих системы. Мы слышим это FlushFileBuffers () может быть полностью отключен при использовании настроек реестра некоторые версии Windows. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...