这是我的代码,它打开一个XML文件(old.xml),过滤无效字符并写入另一个XML文件(abc.xml)。最后,我将再次加载XML(abc.xml)。当执行followling行时,有异常说xml文件被另一个进程使用,我的代码在哪里泄漏?
xDoc.Load("C:\\abc.xml");
有没有人有什么想法是什么错?我的代码中有任何泄漏,为什么(我一直在使用“使用”关键字,感到困惑,看到泄漏......)?
这是我的整个代码,我在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);
}
编辑1:我试图将缓冲区的大小从10M更改为1M,它的工作原理!我很困惑,有什么想法?
编辑2:我发现这个问题很容易重现,当输入的旧XML文件非常大,像100M或什么的。我怀疑它是否是.Net已知的错误?我将使用ProcessExplorer/ProcessMonitor等工具来查看哪些进程锁定了文件,以防止它被XmlDocument.Load访问。
为什么这么大的缓冲区? (尽管它不应该涉及到这个问题,但知道为什么10Mb会很有趣)。我可能会使用10K,也许... – 2009-05-18 12:23:01
我试图将缓冲区的大小从10M更改为1M,它的工作原理!我很困惑,有什么想法? – George2 2009-05-18 12:24:47
我在原始代码中使用大缓冲区大小纯粹是为了测试目的,而不是故意设置的临时值。 – George2 2009-05-18 12:25:23