无法访问文件

本文关键字:文件 访问 | 更新日期: 2023-09-27 18:15:19

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

我正在使用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);

我相信有一个很简单的解释。

提前感谢您的回复

无法访问文件

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

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

使用XDocument的重载。加载一个Uri(文件名),而不是一个流

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

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