c# – StreamReader和寻找

前端之家收集整理的这篇文章主要介绍了c# – 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自己一起工作.

更新:
从这里使用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());
}

猜你在找的C#相关文章