【发布时间】:2018-11-28 13:00:19
【问题描述】:
我有一个流读取器正在读取文件流。我想在发生 IOException 的情况下将流的位置返回到上一行以尝试再次读取同一行。我试图只记录行前流的位置,然后寻找到那个点,但我一定是误解或误用了它。
using (var fs = new FileStream("MyPath\\linetest.txt", FileMode.Open))
using (var sr = new StreamReader(fs))
{
Console.WriteLine(fs.CanSeek);
while (!sr.EndOfStream)
{
string line;
try
{
var streamPosition = fs.Position;
line = sr.ReadLine();
if (line.StartsWith("#"))
{
fs.Seek(streamPosition, SeekOrigin.Begin);
throw new IOException();
}
Console.WriteLine(line);
}
catch (IOException e)
{
Console.WriteLine(e.Message);
}
}
如果它不明显,我会在读取以“#”开头的行时抛出异常。我的 7 行测试文件中只有一行以 # 开头,所以我希望该行以无限循环的形式编写,但是,当我执行此操作时,它会打印文件的每一行,并将异常消息替换为以。。开始 #。我们将不胜感激您提供的任何见解或帮助!
【问题讨论】:
-
为什么需要重读该行?是什么让你失去它?此外,它会打印每一行,因为您的
Console.WriteLine(line)在if语句主体之外。它会打印异常消息,因为您通过抛出异常来中断此流程,并且您不会以该行作为消息抛出异常。 -
“所以我希望那行写在一个无限循环中”你没有写那行。
-
异常信息是否无限打印?
-
您正在重置
FileStream位置,但 StreamReader 已经“读取”过了该位置。 -
风格注释:您不应该使用这样的异常。异常适用于真正的异常情况,而不是普通的控制流。
标签: c# stream filestream ioexception