Восстановление файлов при сбое приложения C#

Я создаю приложение WPF/С#, которое удаляет файлы и создает новые перед закрытием (из онлайн-данных). Проблема возникает, когда приложение случайно падает до завершения или даже начала процесса создания нового файла.

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

Чтобы быть более точным, я удаляю 4 файла в начале приложения и создаю новые в конце приложения. Но если приложение вылетает посередине, файлы теряются.

Как я могу предотвратить эту проблему?

Я пытался уменьшить вероятность случайного сбоя, но время от времени это все же происходит.


person John Demetriou    schedule 05.11.2012    source источник
comment
Решение будет состоять в том, чтобы удалить файлы только после того, как новый файл будет завершен.   -  person Security Hound    schedule 05.11.2012
comment
Я должен сначала удалить, а затем найти новые файлы, поскольку они загружаются с тем же именем (именно так они ДОЛЖНЫ быть, это проект класса), поэтому их нужно переименовать/удалить и т. д. перед созданием новых   -  person John Demetriou    schedule 05.11.2012


Ответы (4)


Если вы беспокоитесь о потере файла(ов), вы можете:

  • перед удалением A.txt (скажем) при запуске создайте его копию A.tmp и после удалите.
  • при закрытии создайте новые файлы и удалите все tmp файла(ов), присутствующих в каталоге.

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

person Tigran    schedule 05.11.2012

При запуске ничего не делайте с файлами.

При выключении выполните следующую процедуру:

  1. Создайте новые файлы с именем OLDNAME.tmp или что-то в этом роде. Если он уже существует, выбросьте его и создайте заново.
  2. Переименуйте новые файлы поверх старых через MoveFileTransacted() (MSDN)

Если вы застряли на старой версии Windows без MoveFileTransacted(), все становится сложнее: http://blogs.msdn.com/b/adioltean/archive/2005/12/28/507866.aspx


Примечание. Если вы окажетесь в файловой системе, совместимой с POSIX, стандартная операция переименования гарантированно будет атомарной, что сделает шаг 2 тривиальным.

person Deestan    schedule 05.11.2012

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

person Andrew Sklyarevsky    schedule 05.11.2012

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

person James Barrass    schedule 05.11.2012