一尘不染

StreamReader和寻求

c#

您可以使用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());

阅读 250

收藏
2020-05-19

共1个答案

一尘不染

是的,您可以看到以下内容:

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()用于其他reads方法,但显然不能与其他reads方法一起使用),然后可以执行以下操作:

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());
}
2020-05-19