Обнаружение и обработка внезапной конечной задачи приложения, перезапуск и завершение работы?

#c# #crash

#c# #сбой

Вопрос:

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

Я подумал о том, чтобы сохранить все содержимое XML в базе данных и проверить, есть ли какие-либо ошибки, а затем заменить старое содержимое.

Любые идеи, советы или мысли приветствуются.

Ответ №1:

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

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

Лучший, но более продвинутый вариант — переместить все в базу данных с поддержкой транзакций.

Комментарии:

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

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

3. @user733659: проверьте класс MemoryStream. Он ведет себя как поток файлов, но сохраняет данные в памяти, а не на диске. В большинстве мест, где используется FileStream, вместо него можно использовать MemoryStream.