C# 如何检查StreamReader是否仍处于打开状态?
我试图用一些额外的方法和属性将一个C# 如何检查StreamReader是否仍处于打开状态?,c#,C#,我试图用一些额外的方法和属性将一个StreamReader封装在一个类Fichier中 我想要两件事: StreamReader在Fichier类中自动打开 StreamReader在我们使用重写方法ReadLine时打开,而不是在之前打开(我们需要在使用StreamReader读取文件之前对其进行修改) 我的一段代码如下所示: public string ReadLine() { if (Reader == null || ???) { Reader = n
StreamReader
封装在一个类Fichier
中
我想要两件事:
在StreamReader
类中自动打开李>Fichier
在我们使用重写方法StreamReader
时打开,而不是在之前打开(我们需要在使用ReadLine
读取文件之前对其进行修改)StreamReader
public string ReadLine()
{
if (Reader == null || ???)
{
Reader = new StreamReader(Path);
}
return Reader.ReadLine();
}
在?
,我想检查StreamReader是否已关闭。事实上,如果我们这样做:
StreamReader sr = new StreamReader(path);
sr.Close();
sr
不为空,但如何检查它是否已关闭,以及如何重新打开它
如果您想知道为什么我需要打开和关闭
StreamReader
,那是因为Fichier
对象需要随时存在,但它所代表的文件需要在外部程序中多次修改。没有公共方法检查流/读取器是否关闭。只要在关闭reader
后立即将其设置为空:
Reader.Close();
reader = null;
或者单独挂一面旗 最简单的方法是
Dispose
(您真的应该这样做,它也会关闭流),并在关闭流时将其设置为null
您也可以选择检查
EndOfStream
,但这要求您读取到流的末尾。关闭读卡器时,只需将引用设置为null:
sr.Close();
sr = null;
没有理由挂起流读取器,因为您无法重新打开它。您必须创建一个新的流阅读器。StreamReader.Close()
如果将leaveOpen
标志设置为false
,则将执行许多操作,如果是这种情况,则可以检查StreamReader.BaseStream
是否为null
var stream = File.OpenRead(@"C:\test.xml");
var streamReader = new StreamReader(stream);
Console.WriteLine(streamReader.BaseStream == null);
streamReader.Close();
Console.WriteLine(streamReader.BaseStream == null);
产出:
假的
真的
按任意键继续
System.IO
名称空间有一个名为File
的类,因此请小心不要将自己的类与该类混淆。.BaseStream.CanRead
也许,尽管显式处理/null会更好。我是法国人,所以我的类是“Fichier”。我会编辑这个,我想要全面,但我做了相反的事情。你不应该设计一个可以关闭和重新打开其流的文件流包装器。保持简单。这可能是XY问题。好主意;非常感谢。为什么我更喜欢Dispose
而不是Close
?(根据本主题,Close
调用Dispose
:)@Chostakovitch:观点各异,但我的观点是:如果它实现了IDisposable
,请调用Dispose
。这也是未来的证明,因为当微软更新它时,它确实需要处理,你是安全的。我没有想到,即使它很简单。谢谢,这个主意很有趣。我认为这种行为没有被记录在案,所以最好不要依赖它。事实上,如果一个人无法控制何时放置读取器,这可能是一个选项。此外,使用StreamReader
特定属性将限制使用其他读卡器的选项(即基本TextReader
)。