【发布时间】:2009-05-18 11:52:41
【问题描述】:
这是我的代码,它打开一个 XML 文件 (old.xml)、过滤无效字符并写入另一个 XML 文件 (abc.xml)。最后,我将再次加载 XML (abc.xml)。执行以下行时,出现异常说xml文件被另一个进程使用,
xDoc.Load("C:\\abc.xml");
有没有人知道什么是错的?我的代码中是否有任何泄漏以及原因(我一直在使用“using”关键字,对看到泄漏感到困惑......)?
这是我的全部代码,我在 Windows Vista x64 下使用 C# + VSTS 2008。
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
Encoding encoding = Encoding.GetEncoding("utf-8", new EncoderReplacementFallback(String.Empty), new DecoderReplacementFallback(String.Empty));
using (TextWriter writer = new StreamWriter(new FileStream("C:\\abc.xml", FileMode.Create), Encoding.UTF8))
{
using (StreamReader sr = new StreamReader(
"C:\\old.xml",
encoding
))
{
int bufferSize = 10 * 1024 * 1024; //could be anything
char[] buffer = new char[bufferSize];
// Read from the file until the end of the file is reached.
int actualsize = sr.Read(buffer, 0, bufferSize);
writer.Write(buffer, 0, actualsize);
while (actualsize > 0)
{
actualsize = sr.Read(buffer, 0, bufferSize);
writer.Write(buffer, 0, actualsize);
}
}
}
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("C:\\abc.xml");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
EDIT1:我尝试将缓冲区的大小从 10M 更改为 1M,它可以工作!我很困惑,有什么想法吗?
EDIT2:当输入的旧 XML 文件非常大(例如 100M 之类)时,我发现这个问题很容易重现。我怀疑它是否是.Net 已知的错误?我将使用 ProcessExplorer/ProcessMonitor 之类的工具来查看哪个进程锁定了文件以防止 XmlDocument.Load 访问它。
【问题讨论】:
-
为什么缓冲区这么大? (虽然它不应该与问题有关,但知道为什么 10Mb 会很有趣......)。我可能会使用 10k,也许......
-
我尝试将缓冲区的大小从 10M 更改为 1M,它可以工作!我很困惑,有什么想法吗?
-
我在原始代码中使用大缓冲区纯粹是为了测试目的,一个临时值,不是故意设置的。
标签: c# file memory-leaks