«Процесс не может получить доступ к файлу, потому что он используется другим процессом» во время написания XML

1

В настоящее время я пытаюсь создать некоторый код для добавления в мой 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
    Почему вы сохраняете файл открытым после того, как написали в него? Решит ли это проблему, если вы закроете ее после каждой записи и откроете ее с флагом «Добавить»?
  • 0
    Ваша основная проблема заключается в том, что вы передаете FullPath (имя файла) в конструктор XmlTextWriter , когда я думаю, что вы хотите передать existingFile файл (поток). Это, вероятно, заставит код работать, но в итоге вы получите неверный XML.
Показать ещё 3 комментария
Теги:

1 ответ

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.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню