Как очистить все файловые буферы в Windows? - PullRequest
0 голосов
/ 06 января 2019

В Windows имеется FlushFileBuffers() API для очистки буферов до жесткого диска для одного файла. В Linux существует sync() API для очистки файловых буферов для всех файлов.

Однако, есть ли WinAPI для очистки всех файлов, то есть sync() аналог?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers

Можно очистить весь жесткий диск.

Чтобы сбросить все открытые файлы на томе, вызовите FlushFileBuffers с дескриптором для тома. Абонент должен иметь права администратора. Для получения дополнительной информации см. Запуск со специальными привилегиями.

Кроме того, в той же статье указывается правильная процедура, которую необходимо выполнить, если по какой-то причине данные должны быть сброшены: CreateFile функция с флагами FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH.

Из-за взаимодействия кэширования диска в системе функция FlushFileBuffers может быть неэффективной при использовании после каждой записи на устройство с диском, когда многие записи выполняются отдельно. Если приложение выполняет несколько операций записи на диск, а также необходимо обеспечить запись критических данных на постоянный носитель, приложение должно использовать небуферизованный ввод-вывод вместо частого вызова FlushFileBuffers. Чтобы открыть файл для небуферизованного ввода-вывода, вызовите функцию CreateFile с флагами FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH. Это предотвращает кэширование содержимого файла и сбрасывает метаданные на диск при каждой записи. Для получения дополнительной информации см. CreateFile.

Но также проверьте ограничения буферизации файлов в отношении памяти и выравнивания данных.

0 голосов
/ 06 января 2019

Согласно функциям управления файлами в WinAPI нет никакого sync() аналога из Linux.

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