2012-01-28 2 views
1

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

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

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

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

Благодаря

+0

Вы можете очистить весь объем. Также выполняется с помощью FlushFileBuffers(), используя ручку для тома. Непонятно, как вы надеетесь сделать это сразу после закрытия приложения. И кто-то проезжает шнур питания прямо между ними. Получите ИБП для реального (и быстрого) исправления. –

+0

Спасибо, полный объем может быть медленным. Интервал сохранения данных - где-то в 5+ мин. ИБП не решит проблему, это не внутренняя программа, ее функция предназначена для решения этих проблем с резервным копированием для других. – Spider

ответ

1

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

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

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

Далее, у Windows есть простейший и простой в использовании transactional file system.

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

+0

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

+0

@Spider: Я понимаю, что вы делаете контрольно-пропускной пункт не очень часто, 5 минут или около того? В этом случае вращение вашего 2 файла должно быть достаточно прочным. В системе, которая не перегружена, буферы по-прежнему будут размыты в единицах секунд в любом случае. – kkm

+0

А я вижу, большое спасибо! – Spider