5

我的类 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: The process cannot access the file 'C:......\Debug\xml.xml' because it is being used by another process

我已经用谷歌搜索了这个问题,并且我尝试了 XmlReader、StreamReader 的多种解决方案……但我总是遇到同样的例外……

我的问题是:如何在我的方法 Load for 中修复此异常?

谢谢

4

3 回答 3

10

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

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

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

于 2013-07-25T14:25:10.160 回答
2

您需要处理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.

于 2013-07-25T14:25:41.677 回答
0

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

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

或者:

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

如果您不手动处理它,它将在 GC 收集它时随机处理......但在此之前它将保存文件。

于 2013-07-25T14:28:12.417 回答