"进程无法访问该文件,因为它正被另一个进程使用"在编写XML时

时间:2014-11-26 14:48:24

标签: c# xml

我目前正在尝试创建一些代码以附加到我的XML文件,它将首先检查文件是否已创建以及是否已创建;然后它会打开文件准备好追加。

但问题是,我在最后一行收到上述错误消息。如果我在此行之前放入existingFile.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);
}

1 个答案:

答案 0 :(得分: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类。

我发现它是一个更干净,更易于使用的界面。