Проблема с обработкой файлов - PullRequest
0 голосов
/ 10 ноября 2009

Я занимаюсь разработкой инструмента на c #, в одном случае я начинаю непрерывно записывать в xml-файл, используя свой инструмент, когда я неожиданно перезагружаю машину, появляется конкретный xml-файл поврежден, в чем причина, как этого избежать?

xmldocument x= new xmldocument();
x.open();
// change a value of the node every time
x.save();
x=null

это мой код

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

Не используйте XML.

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

Это означает, что вы всегда получите неверный файл XML, если преждевременно отмените запись (завершив процесс или перезагрузив компьютер и т. Д.).

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

2 голосов
/ 10 ноября 2009

Используйте «шаблон безопасной замены». Например, заменить файл foo.txt

  • Написать в foo.new
  • Переместить foo.txt в foo.old
  • Переместить foo.new в foo.txt
  • Удалить foo.old

В любой момент у вас есть хотя бы один полный действительный файл.

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

0 голосов
/ 10 ноября 2009

Причиной повреждения вашего файла является то, что из-за сбоя вы его никогда не закрывали. Я помню, как однажды решал такую ​​проблему с помощью файла, перекрывающего флаг. Но это было в C ++ с использованием метода CreateFile.

0 голосов
/ 10 ноября 2009

Убедитесь, что ваш файл правильно закрыт перед закрытием приложения.

Кроме того, как кто-то указал, файл XML должен быть правильно завершен закрывающими тегами.

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

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