您可以使用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自己一起工作.
更新:
从这里使用TGREER.myStreamReader:
http://www.daniweb.com/software-development/csharp/threads/35078
这个类添加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()); }