2014-11-26 2 views
1

В настоящее время я пытаюсь создать некоторый код для добавления в мой XML-файл, он сначала проверит, создан ли файл, и если он ; он откроет файл, готовый для добавления.«процесс не может получить доступ к файлу, потому что он используется другим процессом» при написании XML

Но проблема в том, что я получаю вышеуказанное сообщение об ошибке на последней строке. Если я поставлю существующийFile.Close() перед этой строкой, ошибка исчезнет; но тогда данные не добавляются.

Не мог бы кто-нибудь помочь мне.

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

Код

if (System.IO.File.Exists(FullPath)) 
{ 
    found = true; 
    System.IO.FileStream existingFile = System.IO.File.OpenWrite(FullPath);      
    existingFile.Seek(-endtag.Length, System.IO.SeekOrigin.End);     
    writer = new System.Xml.XmlTextWriter(FullPath, System.Text.Encoding.UTF8); 
} 
+0

Почему вы сохраняете файл открытым после того, как вы его написали? Будет ли это решить проблему, если вы закроете ее после каждой записи и откройте ее с помощью флажка «Добавить»? – Default

+0

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

+0

С другой стороны, это интересная идея: поиск назад конца тега. Вы должны быть уверены, что ваш 'XmlTextWriter' не пытается добавить заголовок xml, но если вы это сделаете, это может сработать. –

ответ

0

ниже код работает, но с некоторыми предостережениями.

Во-первых, он предполагает, что между элементами не существует новой строки. То есть, XML, как:

<RootNode><Element></Element></RootNode> 

Вместо

<RootNode> 
    <Element> 
    </Element> 
</RootNode> 

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

Я немного разочарован тем, что мне нужно закрыть файл, а затем позвонить File.AppendText, чтобы добавить конечный тег, но я не мог придумать лучшего способа. Не должно быть большой проблемой, если вы не будете сильно ударять по этой вещи.

private const string EndTag = "</RootNode>"; 

    private void AppendXmlFile() 
    { 
     using (var fs = File.OpenWrite(XmlFilename)) 
     { 
      fs.Seek(-EndTag.Length, SeekOrigin.End); 
      var settings = new XmlWriterSettings {OmitXmlDeclaration = true}; 
      using (var writer = XmlWriter.Create(fs, settings)) 
      { 
       writer.WriteStartElement("xyzzy"); 
       writer.WriteAttributeString("magic", "plugh"); 
       writer.WriteEndElement(); 
      } 
     } 
     // Now write the end tag 
     File.AppendAllText(XmlFilename, EndTag); 
    } 

Обратите внимание, что я указываю XmlWriter опустить декларацию XML. В противном случае вы получаете новый XML-заголовок (т. Е. <?xml ...>).

Кстати, я использовал XmlWriter, а не XmlTextWriter. Поскольку документация XmlTextWriter говорит:

Начав с .NET Framework 2.0, мы рекомендуем использовать класс вместо System.Xml.XmlWriter.

Я считаю, что это более чистый и простой в использовании интерфейс.

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

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