加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – StreamReader和寻找

发布时间:2020-12-15 06:32:33 所属栏目:百科 来源:网络整理
导读:您可以使用streamreader读取一个正常的文本文件,然后在读取中间关闭流程器,保存当前位置,然后再次打开流程式读取器,并开始读取这个词? 如果没有什么我可以用来完成相同的情况,而不锁定文件? 这样的: var fs = File.Open(@"C:testfile.txt",FileMode.Open
您可以使用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","1234n56789");

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读