Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查StreamReader是否仍处于打开状态?_C# - Fatal编程技术网

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
)。