StreamReader.ReadLine将挂起无限循环

Asa*_*nka 9 .net c# streamreader

我有一个简单的程序来使用StreamReader读取文件并逐行处理.但我正在阅读的文件有时可能位于网络文件夹中.我在使用这样的文件进行一些测试时遇到过,如果网络连接在我正在读取的某个时刻丢失,它将再次保持在同一行,并且在无限循环中循环,产生与结果相同的行来自stream.ReadLine().

有什么方法可以在流本身没有fileHandle时找到?我期待FileReotAvailableException类型的异常会在StreamReader丢失文件句柄时触发.

这是我的代码片段......

        string file = @"Z://1601120903.csv"; //Network file
        string line;
        StringBuilder stb = new StringBuilder();      
        StreamReader stream = new StreamReader(file, Encoding.UTF8, true, 1048576);
        do
        {
            line = stream.ReadLine();
            // Do some work here
        } while (line != "");
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 17

null空字符串比较:

https://msdn.microsoft.com/en-us/library/system.io.streamreader.readline(v=vs.110).aspx

返回值类型:System.String输入流中的下一行,如果到达输入流的末尾,则为null.

    do
    {
        line = stream.ReadLine();
        // Do some work here
    } while (line != null);
Run Code Online (Sandbox Code Playgroud)

然而,更好的方法是让.Net为您完成工作(逐行文件读取)并放弃所有读者:

  foreach (String line in File.ReadLines(file)) {
    // Do some work here
  }
Run Code Online (Sandbox Code Playgroud)

  • @terbubbs:不,*空字符串*可以很好地出现在文件的中间 (4认同)
  • @Asanka:请注意,我把`File.ReadLines`放在`File.ReadAllLines`中; 和`File.ReadLines`不会将所有行加载到内存中 (3认同)

Dmi*_*ryG 7

正确的方法1(EndOfStream):

using(StreamReader sr = new StreamReader(...)) {
    while(!sr.EndOfStream) {
        string line = sr.ReadLine();
        Console.WriteLine(line);
    }
}
Run Code Online (Sandbox Code Playgroud)

正确方法2(Peek)

using(StreamReader sr = new StreamReader(...)) {
    while(sr.Peek() >= 0) {
        string line = sr.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:将空字符串威胁为文件末尾是不正确的.

如果网络连接在我正在读取的某个时刻丢失,它将再次保持在同一行,并再次在无限循环中循环,产生与stream.ReadLine()的结果相同的行

我现在已经检查了这个场景 - System.IO.IOException在这种情况下应该抛出("未找到网络路径."}.

用try catch块包装它不会解决我的问题,不是吗?

在这种情况下,您可以按如下方式打破读数:

string line;
do {
    try {
        line = sr.ReadLine();
        // Do some work here
    }
    catch(System.IO.IOException) {
        break; 
    }
} while(line != null);
Run Code Online (Sandbox Code Playgroud)