FlushFileBuffers на уже записанный файл - PullRequest
1 голос
/ 28 января 2012

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

Вопрос в следующем: Если я записал данные с компонентом (например: ComponentX-> WriteToFile (имя файла)), могу ли я затем использовать Handle = OpenFile (имя файла) и затем FlushFileBuffers (дескриптор), чтобы обеспечить согласованность данных? Или этот трюк не сработает?

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

Если это может не сработать, есть ли какой-либо другой способ, кроме как сделать данные из компонента самостоятельно (с помощью CreateFile, ...)

1 Ответ

1 голос
/ 29 января 2012

Никакая промывка не решит вашу проблему.Что делать, если система зависает во время очистки буферов?

Существует несколько решений.Вы можете записать в 2 (или более) чередующихся файла, для одного: вы знаете, что если один поврежден, предыдущий, скорее всего, будет в порядке (за исключением некоторого ужасного замораживания во время сценариев восстановления).Это хорошо работает, если ваши файлы контрольных точек маленькие.Запись контрольной суммы с данными помогает избежать сомнений при восстановлении.

Открытие файла с FILE_FLAG_NO_BUFFERING требует прямой записи на диск, избегая сквозного кэша системы.Это работает, вероятно, лучше в сочетании с предыдущим вариантом, так как система все еще может дать сбой во время контрольной точки, искажающей весь файл.

Далее, у Windows есть производительная и простая в использовании транзакционная файловая система .

Наконец, если у вас нет доступа к способу записи контрольных точек, просто установите некоторую процедуру резервного копирования, чтобы сохранить файл контрольных точек на другом диске между контрольными точками.Если файл запаздывает, вы можете использовать некоторые программы горячего резервного копирования, доступные в избытке от 0 до 100 долларов.Утилита Windows Robocopy вполне может соответствовать вашим требованиям.

...