【问题标题】:File.ReadLines "Can't Read From Closed TextReader"File.ReadLines“无法从关闭的 TextReader 中读取”
【发布时间】:2016-04-22 06:48:49
【问题描述】:

我遇到了一个奇怪的异常,我不确定是什么原因造成的。当我使用时在我的本地机器上:

var lines = File.ReadLines("filePath");
foreach(string line in lines)...

这可以完美运行,没有任何问题。该代码位于基于 .NetFramework 4.5 的项目中。该 dll 引用自托管在 .NetFramework 4.0 池上的网站。

一旦我将我的作品上传到主机并开始使用它,代码中使用File.ReadLines 的所有实例都会引发异常。我用File.ReadAllLines 替换了代码,它成功了。

我已经阅读了很多关于此的问题,但我认为他们中的任何一个都无法回答为什么会发生这种情况。可能是 .NetFramework 版本还是其他版本?

【问题讨论】:

  • 你好,你是怎么解决的?我面临同样的问题。当我们读取大文件时,ReadAllLines 并不好,因为它会尝试将整个文件加载到内存中。所以我也必须使用 ReadLine 。但遇到同样的错误。

标签: c# file readline


【解决方案1】:

请注意,ReadLines 仅允许您对行进行一次迭代,在该方法的底层执行类似于此的操作:

private IENumerable<string> ReadLine(string path)
{
    var file = OpenFile(path);
    while (file.Read())
    {
        yield return file.GetLine();
    }
    file.Close();
}

这意味着文件在您完成对 IEnumerable 的交互之前是打开的,并且在您到达它的末尾时立即关闭。也许调用 ReadAllLines 会更简单,它会返回一个很好的旧字符串 [],让您可以随意迭代它。

【讨论】:

  • 我熟悉 ReadLines 的工作原理以及它在我的本地机器上的实际工作正常,我从来没有遇到过任何问题。暂时我已经用 ReadAllLines 代替了,这很好,但是当我托管代码时,它开始表现得很奇怪。
  • 好吧,除了枚举器关闭文件之外,我想不出其他导致此错误的原因。如果没有进一步的上下文,很难想到另一种可能性,这是在您的服务器机器上一直崩溃还是有时会发生?如果后者是“行”一个实例字段还是在方法内部?
  • 是的,它总是发生在我的服务器机器上,并且“行”在方法内。
【解决方案2】:

ReadLine 方法是在 .NET Framework 4.0 中引入的,而ReadAllLines 是在 .NET Framework 2.0 中引入的。所以,问题可能出在 .NET 版本上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多