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:別のプロセスによって使用されているため、プロセスはファイル 'C:......\Debug\xml.xml' にアクセスできません。

私はこの問題をグーグルで検索し、XmlReader、StreamReaderで複数のソリューションを試しました...常に同じ例外があります...

私の質問は次のとおりです。この例外を修正するには、メソッド Load をどうすればよいですか?

ありがとう

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 に答える