无法访问简单文件“”;因为它正被另一个过程使用”;

本文关键字:另一个 过程 因为 文件 简单 访问 | 更新日期: 2023-09-27 18:25:05

我在类EDIDocument中有一个简单的方法,用于加载xml:

    /// <summary>
    /// Method used to load specific target file as template
    /// </summary>
    /// <param name="filepath">file path</param>
    /// <returns>loading status</returns>
    public bool Load(string filepath)
    {
        //file exists
        bool returnValue = File.Exists(filepath);
        //file is a xml
        returnValue &= Path.GetExtension(filepath).Equals(".xml");
        //if file is valid
        if (returnValue)
        {
            XmlReader reader = XmlReader.Create(filepath);
            //load document
            this._xmldoc = XDocument.Load(reader);
            //load complete
            returnValue &= (this._xmldoc != null);
        }
        //End of method
        return returnValue;
    }

我有一个这种方法的单元测试:

    /// <summary>
    /// Test success on load xml document
    /// </summary>
    [TestMethod]
    public void TestLoadXML_Success()
    {
        File.Create("xml.xml");
        //create document
        EDIDocument doc = new EDIDocument();
        //load something wrong
        bool result = doc.Load("xml.xml");
        //test
        Assert.IsTrue(result);
    }

当我开始单元测试时,我总是有一个例外:

测试方法EDIDocumentTest.TestLoadXML_Success引发异常:System.IO.IOException:进程无法访问文件"C:……"。。。。。。''Debug''xml.xml',因为它正被另一个进程使用

我已经在谷歌上搜索了这个问题,并尝试了XmlReader、StreamReader的多种解决方案。。。我总是有同样的例外。。。

我的问题是:对我的方法Load for做什么来修复这个异常?

感谢

无法访问简单文件“”;因为它正被另一个过程使用”;

File.Create向文件返回一个流,因此它保持一个句柄打开。您需要首先关闭文件。这应该有效:

File.Create("xml.xml").Close();

有关更多详细信息,请参阅此问题:为什么需要关闭File.Create?

您需要处理XmlReader:

using (XmlReader reader = XmlReader.Create(filepath))
{
    //load document
    this._xmldoc = XDocument.Load(reader);
    //load complete
    returnValue &= (this._xmldoc != null);
}

您还需要更改创建文件的方式,如下所示:

File.WriteAllText("xml.xml", "");

因为您从未处理过File.Create中使用的文件系统句柄。

File.Create有一个返回值。这是一个文件流
该FileStream保存该文件
您需要处理该FileStream才能访问该文件:

FileStream f = File.Create("xml.xml");
f.Dispose();

或:

using (File.Create("xml.xml")) {}

如果你不手动处理它,当GC收集它时,它会被随机处理……但在此之前,它会保存文件。