DataSet.WriteXml(XmlTextWriter)使XML文件锁定

时间:2013-11-13 14:49:07

标签: c# xml dataset xmlwriter filelock

我有一个用.NET 3.5编写的程序,它将数据保存到XML文件中,大部分时间都会在此之后不再使用它。但是,有时它需要重新读取该XML文件。当我尝试这样做时,XML文件读取失败,并显示该文件“正被另一个进程使用”的错误。

以下是执行XML文件写入的代码:

DataSet ds = new DataSet();
ds.Tables.Add(populatedDataTable);

XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8);
ds.WriteXml(xmlWrite);
xmlWrite.Close();

这是尝试重新读取XML文件的代码:

TextReader tr = new StreamReader("C:\test\output.xml");
DataSet dsXmlData = new DataSet();
dsXmlData.ReadXml(tr);

由于XmlTextWriter.Close()方法在第一个块中运行,为什么文件仍在使用?我尝试在第一个块中的DataSet上调用Dispose()方法,但这没有帮助。这里可能缺少什么?

我还测试了在调试模式下运行程序,然后在第一个代码块运行后等待一点,然后再继续。它仍然给出了同样的错误,这不是代码运行如此接近的问题,以至于在尝试读取之前文件写入没有完全释放。

谢谢!

1 个答案:

答案 0 :(得分:3)

我能够通过更改逻辑来使用using语句而不是创建XmlTextWriter然后手动关闭它来解决问题。

这是旧代码:

XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8);
ds.WriteXml(xmlWrite);
xmlWrite.Close();

以下是不再存在问题的新代码:

using(XmlTextWriter xmlWrite = new XmlTextWriter("C:\test\output.xml", Encoding.UTF8))
    ds.WriteXml(xmlWrite);

对于任何好奇的人,我都没有回答为什么using语句可以解决问题,但我很高兴能够解决这个问题。