Как восстановить данные о сбое питания с помощью программирования C ++ на Windows - PullRequest
3 голосов
/ 16 апреля 2010

В моей программе я пишу файл состояний своих программ. Я записываю файл много раз в файл во время выполнения программы, потому что программа изменяет некоторые переменные, которые мне нужно хранить очень часто.

Теперь, если по каким-то причинам у меня отключится питание. Затем большую часть времени я теряю данные в этом файле.

Пожалуйста, расскажите мне о любом механизме, который может защитить данные даже в случае сбоя питания. (Я написал C ++ программу для Windows).

Спасибо

Ответы [ 5 ]

2 голосов
/ 16 апреля 2010

Используйте транзакционную базу данных, такую ​​как SQL Server.Регулярно вносите изменения в базу данных.Маловероятно, что ваши данные будут повреждены при сбое питания сервера базы данных, но на всякий случай целесообразно регулярно делать резервные копии.

0 голосов
/ 16 апреля 2010

Вам необходимо использовать FlushFileBuffers (win32 API) или POSIX fsync (для POSIX OS), чтобы обеспечить физическую запись данных на диск. После того как вы позвонили, вы можете быть уверены, что данные являются постоянными. Это как бедняк D из КИСЛОТЫ.

Но учтите, что эти функции очень медленные ... используйте с осторожностью.

0 голосов
/ 16 апреля 2010

SQLite - хороший выбор, если в настоящее время вы используете один плоский файл для каждой установки. Это общедоступная однофайловая база данных, разработанная для ACID-совместимости , включая устойчивость к сбоям питания во время записи данных. Для этого существует множество API C ++ .

0 голосов
/ 16 апреля 2010

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

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

Восстановление будет немного сложнее, так как вам придется восстанавливать весь файл состояния, но вы не должны сильно терять, если какие-либо данные (часто сбрасываются).

0 голосов
/ 16 апреля 2010

Очистите файл как можно чаще или получите ИБП ;)

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