Как защитить файл от повреждения при отключении питания?

251
11 мая 2017, 09:56

Программа хранит ряд настроек в xml-файле. Если в момента записи настройки отключается питание компьютера, содержимое файла пропадает (сам файл остается, но если открыть - он пустой). Появилась идея сохранять изменения во временный файл, а затем переносить их в основной. Тогда, теоретически, должен повредиться только один из файлов при сбросе питания. Но на деле пропадает содержимое обоих файлов. Причина в коде? Или сам подход неправильный? Сохранение временного файла и его копирование в файл-оригинал представлено ниже:

StreamWriter streamWriter = new StreamWriter(FileName_);
BlockFile.WaitOne();
xmlDoc.Save(streamWriter);                    
BlockFile.Release();
streamWriter.Dispose();
File.Copy(FileName_, FileName, true);
Answer 1

Рекомендую сделать так:

  1. Вы сохраняете новый файл с именем settings_new.xml
  2. В случае успеха (проверка файла settings_new.xml на существование и ненулевую длину) удаляете файл settings.xml
  3. Переименовываете файл settings_new.xml в settings.xml (можно так же скопировать и удалить оригинал)
  4. При новом запуске приложения сначала ищете файл settings_new.xml. Если он существует и не пуст, значит произошел сбой питания или некорректное завершение работы программы. В этом случае доделываете операции 2 и 3.

Если вы выполните этот алгоритм, то при любом сбое вы будете уверены настройки не пропадут.

Answer 2

Доброго времени суток! Последовательность должна быть такой:

Открытие рабочего файла

1) Проверяете существование ~settings.xml

2.1) Если существует то открываете его с доступом на чтение

2.2) Открываете файл settings.xml с доступом на запись

2.3) Записываете содержимое файла ~settings.xml в settings.xml

2.4) Закрываете файлы. Удаляете ~settings.xml (далее работает по пунктам следующим пунктам)

3) Если файл ~settings.xml не существует, то открываете файл settings.xml с доступом на чтение

4) Создаете файл ~settings.xml и открываете с доступом на запись

5) Работаете с файлом ~settings.xml

Сохранение результатов

1) Закрываете оба файла

2) Открываете файл ~settings.xml с доступом на чтение и файл settings.xml с доступом на запись

3) Перезаписываете файл settings.xml содержимым файла ~settings.xml

4) Закрываете оба файла. Удаляете ~settings.xml

Этот алгоритм должен предотвратить полную потерю данных

READ ALSO
Отображать последние 5 строк из файла

Отображать последние 5 строк из файла

Нашёл на просторах кодОчень удобно и быстро работает даже с большими файлами, но вот отобразить больше одной строчки у меня не получилось

305
Создание запроса на вывод столбца в RedBeanPhp

Создание запроса на вывод столбца в RedBeanPhp

Как сделать запрос на вывод столбца на страницу в RedBeanPhp?

414
WebSocket connection

WebSocket connection

ЗдравствуйтеПытаюсь настроить websocket, а у меня постоянно выдает ошибку

598