C# XDocument.Save()无法访问文件

C# XDocument.Save()无法访问文件,c#,xml,C#,Xml,希望我能得到一些帮助,解决一个我似乎在任何地方都找不到确切答案的恼人问题 我使用XDocument对象将数据附加到xml文档中,然后使用xDoc.save(path)覆盖现有文件,但由于某种原因,第一次运行代码时会抛出一个错误,即使该文件未被任何其他进程使用 *进程无法访问文件“C:\XXX\XXXX\Telemetry\2011\u 11\u 22.tlm”,因为它正被另一个进程使用* 后续迭代不会导致问题 以下是我在删除try/catch以提高可读性时使用的代码:- XElement x =

希望我能得到一些帮助,解决一个我似乎在任何地方都找不到确切答案的恼人问题

我使用XDocument对象将数据附加到xml文档中,然后使用xDoc.save(path)覆盖现有文件,但由于某种原因,第一次运行代码时会抛出一个错误,即使该文件未被任何其他进程使用

*进程无法访问文件“C:\XXX\XXXX\Telemetry\2011\u 11\u 22.tlm”,因为它正被另一个进程使用*

后续迭代不会导致问题

以下是我在删除try/catch以提高可读性时使用的代码:-

XElement x = GenerateTelemetryNode(h); //Create a new element to append

            if (File.Exists(path))
            {
                if (xDoc == null)
                {
                    xDoc = XDocument.Load(new StreamReader(path));
                }
            }
            else
            {
                xDoc = new XDocument();
                xDoc.Add(new XElement("TSD"));
            }
            xDoc.Element("TSD").Add(x);
            xmlPath = path;
            xDoc.Save(path);
我相信有一个非常简单的解释


非常感谢您的回复。

我认为问题在于StreamReader尚未处理,在这种情况下,它仍将附加到文档中。我建议使用
using
子句包装StreamReader创建,以确保在加载文档后立即处理:

 if (xDoc == null)
 {
        using (var sr = new StreamReader(path))
        {        
           xDoc = XDocument.Load(new StreamReader(sr));
        }
 }

目前无法测试,但我怀疑
StreamReader
正在使用它,特别是如果您的第一次迭代仅导致此异常。您是否尝试过:

XElement x = GenerateTelemetryNode(h); //Create a new element to append

        if (File.Exists(path))
        {
            if (xDoc == null)
            {
                StreamReader reader = new StreamReader(path);
                xDoc = XDocument.Load(reader);
                reader.Close();
                reader.Dispose();
            }
        }
        else
        {
            xDoc = new XDocument();
            xDoc.Add(new XElement("TSD"));
        }
        xDoc.Element("TSD").Add(x);
        xmlPath = path;
        xDoc.Save(path);

使用采用Uri(文件名)的XDocument.Load的而不是流。

这解决了我的问题-非常感谢。我将不得不阅读Using关键字-有很多编程经验,但我才刚刚开始完全掌握C#中的许多概念。顺便说一句,漂亮的珍珠酱徽标-从一开始就是他们的忠实粉丝-最后几年才看到他们的现场直播一年前。Dave@davidpcl1977-很高兴它起到了作用。使用关键字是非常值得的,因为它是处理可处置对象的一种非常优雅的方式。期待观看Pearl Jam 20并重温我的青春。-)在Andy的代码中,sr已经是一个流,因此xDoc赋值语句不需要调用StreamReader副本构造它应该是:
XDocument=XDocument.Load(sr);
        if (File.Exists(path))
        {
            if (xDoc == null)
            {
                StreamReader stream = new StreamReader(path);
                using (stream)
                {
                    xDoc = XDocument.Load(stream);
                }
            }
        }
        else
        {
            xDoc = new XDocument();
            xDoc.Add(new XElement("TSD"));
        }
        xDoc.Element("TSD").Add(x);
        xmlPath = path;
        xDoc.Save(path);