【问题标题】:StreamReader ReadLine returns null when not EOFStreamReader ReadLine 在非 EOF 时返回 null
【发布时间】:2014-10-08 12:12:22
【问题描述】:

有一个我从未遇到过也没有听说过的奇怪问题。 StreamReader 类的 ReadLine() 函数似乎偶尔会返回 NULL,好像在文件末尾,但不是。

我的日志文件表明一切都在发生,就好像它实际上已经到达了文件的末尾,但它只是处理它的一部分。似乎没有任何一致性,因为如果我从头开始重新启动该过程,则整个文件都可以顺利处理。

很明显,文件本身并没有什么奇怪的地方,或者它每次都会在同一行上执行此操作,而且它已经发生在几个不同的文件中,并且每次重新运行时,它都可以正常工作。

有人遇到过类似的事情,或者对可能导致这种事情的原因有什么建议吗?

谢谢,

安德鲁

示例:

line = _readerStream.ReadLine();

if (null != line)
{
    eventRetVal = loadFileLineEvent(line);
}
else
{
    // do some housecleaning and log file completed
}

_readerStream 是已经在别处打开的流。

loadFileLineEvent 是一个委托,它在处理行时被传递。这有自己的错误处理(带有日志记录),所以那里没有问题。

上面的例程(未完整显示)也有错误处理(带有日志记录),这也没有被触发。

它到达“else”并记录它到达了文件的末尾,但从我得到的记录数中可以明显看出它没有。

【问题讨论】:

  • 如果您将代码发布在您正在阅读的地方,这可能会有所帮助。这可能与您使用StreamReader 的方式有关。
  • 发布sscce 以便我们重现问题
  • 抱歉,我无法发布代码,因为它与工作相关,而不是我的个人资料。除了将 ReadLine() 语句分配给一个变量,然后检查该变量是否为 NULL 值之外,实际上并没有什么事情发生。我只是希望有人可能遇到过类似的情况,没想到有人会尝试修复我的实际代码。
  • @StarfleetSecurity 我不是在问你的真实(可能很大)代码,发布一个显示你的案例的最小示例代码..
  • 很可能,有人仍在写入文件。由于StreamReader 是分批读取的,它可能甚至在您调用“最后一个”ReadLine 之前就已经到达文件末尾,然后它就退出了。关键是,在文件完全写入并关闭之前不要开始读取文件。

标签: c# streamreader readline eof


【解决方案1】:

您是否尝试过更传统的方法来读取流?这样,您在读取下一个可能为空/空的行之前检查流的结尾。似乎您的代码应该可以工作,但是尝试读取不存在的行时可能会引发 null 异常(但不确定 SR 是否会为此引发)。

 using (StreamReader SR = new StreamReader(OFD.FileName))
 {
     while (!SR.EndOfStream)
     {
         string CurrentLine = SR.ReadLine();
         var eventRetVal = loadFileLineEvent(CurrentLine);
     }
 }

【讨论】:

  • 似乎这将是我所看到的相反问题的答案。问题是它认为它已经到了文件的末尾,但它没有。在您的示例中,即使 EndOfStream 仍然是错误的(应该是错误的),当发生这种情况时,ReadLine() 仍然会为我返回 NULL。这当然是整个问题,它返回 NULL 但它不在文件的末尾。
  • 我的问题已经通过使用此解决方案中的代码 sn-p 解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2012-03-26
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多