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)
正确的方法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)
| 归档时间: |
|
| 查看次数: |
5633 次 |
| 最近记录: |