Return StreamReader to Beginning
我正在逐行读取文件,并且希望能够通过调用方法
如何操作
我有个聪明的主意,就是使用
您需要像以前一样在流中进行搜索,然后在
编辑:添加代码示例:
1 2 3 4 5 |
我使用这种方法:
1 2 3 4 | System.IO.StreamReader reader = new System.IO.StreamReader("file.txt") //end of reading reader.DiscardBufferedData(); reader.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); |
Amy的答案适用于某些文件,但是根据基础流的编码,您可能会得到意想不到的结果。
例如,如果流是UTF-8并具有前同步码,则StreamReader将使用它来检测编码,然后关闭一些内部标志,告诉它检测编码并检查前同步码。如果将流的位置重置为开始,流阅读器现在将再次使用该前同步码,但是它将第二次将其包含在输出中。没有公共方法可以重置此编码和前导码状态,因此,如果您需要"倒带"流阅读器,最安全的方法是如图所示将基础流搜索到开头(或设置位置)并创建一个新的StreamReader,仅在StreamReader上调用DiscardBufferedData()是不够的。
如果
如果不能(例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public long ReadList(string fileName, Action<string> action,long position=0) { if (!File.Exists(fileName)) return 0; using (var reader = new StreamReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),System.Text.Encoding.Unicode)) { if (position > 0)reader.BaseStream.Position = position; while (!reader.EndOfStream) { action(reader.ReadLine()); } return reader.BaseStream.Position; } } |
问题是寻找某种
您正在寻找
1 2 3 4 5 6 7 8 9 10 11 12 | StreamReader sr = new StreamReader("H:/kate/rani.txt"); Console.WriteLine(sr.ReadToEnd()); sr.BaseStream.Position = 0; Console.WriteLine("----------------------------------"); while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); } |