您可以使用streamreader读取正常的文本文件,然后在读取中间保存当前位置后关闭streamreader,然后再次打开streamreader并开始从该位置读取吗?
如果不是,在不锁定文件的情况下,我还能用什么来完成相同的情况?
像这样的东西:
var fs = File.Open(@"C:\testfile.txt", FileMode.Open, FileAccess.Read); var sr = new StreamReader(fs); Debug.WriteLine(sr.ReadLine());//Prints:firstline var pos = fs.Position; while (!sr.EndOfStream) { Debug.WriteLine(sr.ReadLine()); } fs.Seek(pos, SeekOrigin.Begin); Debug.WriteLine(sr.ReadLine());//Prints Nothing, i expect it to print SecondLine.
@lasseespeholt
这是我尝试的代码
var position = -1; StreamReaderSE sr = new StreamReaderSE(@"c:\testfile.txt"); Debug.WriteLine(sr.ReadLine()); position = sr.BytesRead; Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine("Wait"); sr.BaseStream.Seek(position, SeekOrigin.Begin); Debug.WriteLine(sr.ReadLine());
是的,您可以看到以下内容:
var sr = new StreamReader("test.txt"); sr.BaseStream.Seek(2, SeekOrigin.Begin); // Check sr.BaseStream.CanSeek first
更新: 请注意,sr.BaseStream.Position由于StreamReader使用缓冲区,因此不一定使用任何有用的东西,因此它不会反映您实际阅读的内容。我想您会找不到真正的位置。因为您不能只计算字符(不同的编码以及因此的字符长度)。我认为最好的方法是与FileStream自己合作。
sr.BaseStream.Position
StreamReader
FileStream
更新: 使用TGREER.myStreamReader来自此处的内容:http : //www.daniweb.com/software- development/csharp/threads/35078 此类添加了此类BytesRead(可ReadLine()用于其他reads方法,但显然不能与其他reads方法一起使用),然后可以执行以下操作:
TGREER.myStreamReader
BytesRead
ReadLine()
File.WriteAllText("test.txt", "1234\n56789"); long position = -1; using (var sr = new myStreamReader("test.txt")) { Console.WriteLine(sr.ReadLine()); position = sr.BytesRead; } Console.WriteLine("Wait"); using (var sr = new myStreamReader("test.txt")) { sr.BaseStream.Seek(position, SeekOrigin.Begin); Console.WriteLine(sr.ReadToEnd()); }