Принудительная очистка файла в Windows - PullRequest
2 голосов
/ 17 декабря 2010

Я использую ofstream для записи данных в файл.Я регулярно звоню flush для файла, но файл поддержки не всегда обновляется в это время.Я предполагаю, что это связано с кэшем на уровне ОС или чем-то в библиотеках MSVC.

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

Какой API я могу использовать для этого?

Ответы [ 4 ]

1 голос
/ 17 декабря 2010

FlushFileBuffers очистит кэш файлов записи Windows и запишет его в файл.Имейте в виду, что при многократном вызове он может быть очень медленным.

Я также нашел эту статью KB , в которой описано использование _commit ().Это может быть более полезным для вас, так как вы используете ofstream.

CXXFileBuf.flush();
_commit(CXXFileBuf.rdbuf()->fd());
0 голосов
/ 17 ноября 2016

Просто добавьте commode.obj в компоновщик-> Ввод-> Дополнительные зависимости на страницах свойств проекта в Visual Studio и вызовите std::ostream::flush(). Таким образом, std :: ostream flush будет ссылаться на другой метод, который имеет желаемое поведение. Вот что помогло мне.

0 голосов
/ 12 декабря 2011

Я использовал:

MyOfstreamObject.rdbuf()->pubsync();

Я использую stl_port на Win 7 с ICC 9.1.

Я не тестировал решение широко, но, похоже, оно работает ... Может бытьможет решить проблему отсутствия fd (), замеченного edA-qa mort-ora-y.

0 голосов
/ 17 декабря 2010

Если это решение только для Windows, вы можете использовать FlushFileBuffers().Это означает, что вам придется переписать часть своего кода для обработки вызовов CreateFile(), WriteFile() и т. Д. Если ваше приложение зависит от множества различных функций operator<<, вы можете написать свою собственную std::streambuf.

Вы также можете внимательно прочитать раздел с замечаниями.В частности,

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

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