无法访问简单文件“”;因为它正被另一个过程使用”;
本文关键字:另一个 过程 因为 文件 简单 访问 | 更新日期: 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收集它时,它会被随机处理……但在此之前,它会保存文件。