XDocument.Save()无法访问文件

时间:2011-11-22 11:38:18

标签: c# xml

希望我能够从一个令人愤怒的问题得到一些帮助,我似乎无法在任何地方找到明确的答案。

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

*“进程无法访问文件”C:\ XXX \ XXXX \ Telemetry \ 2011_11_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);

我确信有一个非常简单的解释。

非常感谢任何回复。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

使用带有Uri(文件名)而不是流的XDocument.Load的overload

答案 2 :(得分:1)

        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);

答案 3 :(得分:0)

目前无法测试,但我怀疑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);