我需要从头到尾读取流两次。
但是下面的代码会抛出一个ObjectDisposedException: Cannot access a closed file
例外。
string fileToReadPath = @"<path here>";
using (FileStream fs = new FileStream(fileToReadPath, FileMode.Open))
{
using (StreamReader reader = new StreamReader(fs))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
fs.Seek(0, SeekOrigin.Begin); // ObjectDisposedException thrown.
using (StreamReader reader = new StreamReader(fs))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
}
为什么会发生这种情况?真正处置的是什么?以及为什么要操纵StreamReader
以这种方式影响关联的流?期望可查找流可以被多次读取(包括多次读取),这不是合乎逻辑的吗?StreamReader
s?
发生这种情况是因为StreamReader
接管流的“所有权”。换句话说,它让自己负责关闭源流。一旦你的程序调用Dispose
or Close
(离开using
在您的情况下声明范围),那么它也会处理源流。呼唤fs.Dispose()
在你的情况下。所以文件流在离开第一个之后就死了using
堵塞。这是一致的行为,.NET 中包装另一个流的所有流类都以这种方式运行。
有一个构造函数StreamReader
这允许说它doesn't拥有源流。然而,它不能从 .NET 程序访问,构造函数是内部的。
在这种特殊情况下,您可以通过不使用using
-声明StreamReader
。然而,这是一个相当棘手的实现细节。肯定有更好的解决方案可供您使用,但代码过于综合,无法提出真正的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)