2009-11-10 3 views
0

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

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

это мой код

ответ

2

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

  • Пишите foo.new
  • Move foo.txt в foo.old
  • Move foo.new в foo.txt
  • Удалить foo.old

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

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

0

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

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

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

2

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

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

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

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

+1

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

+0

Вам даже не нужно быть это творческое. Это то, что «System.Xml.ConformanceLevel.Fragment» для: вы можете создать «XmlReader», который с радостью обрабатывает элементы XML из входного потока, который не имеет элемента верхнего уровня. Вы даже можете использовать его как вход для преобразования XSLT. –

0

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

Смежные вопросы