代码如下:
protected string GetText(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        string result;
        if ((fs.Length - Length) < page)
        {
            if (fs.Length - Length > 0)
            {
                fs.Position = fs.Length - Length;
            }
            else
            {
                fs.Position = 0;
                fs.Close();
                StreamReader sr1 = new StreamReader(path, Encoding.GetEncoding("GBK"));
                result= sr1.ReadToEnd();
                sr1.Close();
                return result;
            }
        }
        else
        {
            fs.Position = page;
        }
        byte[] buffer = new byte[Length];
        fs.Read(buffer, 0, Length);
        page = fs.Position;
        StreamReader sr = new StreamReader(new MemoryStream(buffer), Encoding.GetEncoding("GBK"));
        result=sr.ReadToEnd();
        sr.Close();
        fs.Close();
        return result.Trim();
    }当从开头截取了后,以后每次继续继续截取出来的内容开头都有乱码,直到遇到下一行才开始正确显示。有时候一行很长,故不能一行一行地截取。不知道有什么优化的方法?

解决方案 »

  1.   

    page 在哪定义的?你是要按什么方式截取呢?   StreamReader   sr1   =   new   StreamReader(path,   Encoding.GetEncoding("GBK")); 
       result=   sr1.ReadToEnd这不就完事了么?
      

  2.   

    page全局变量,用来记录上次文件最后的读取位置。
    因为ANSI编码(该文本文件使用ANSI编码)用不同的字节长度表示字母和汉字。如果要准确读取文本文件中的内容,我只知道从开头开始逐个判读是否是汉字还是字母。如果通过文件读取位置直接跳转,就不能判读接下来读取的是汉字还是字母,因为有可能跳到一个汉字编码中间去。你可以根据以上代码编写一个程序测试一下就知道了。
    PS:同样是ANSI编码的文本文件,如果能够确定文件指针位置接下来是一个字符或者汉字编码的开始,如果要向前回溯,即判读前一个是字符还是汉字,是不是不可能?
      

  3.   

    补充:page为文件读取开始位置,Length为要读取长度。if语句用来校正文件接近结束时的最后一次读取位置,使得读取完后刚好文件结束,或者当文件长度少于读取长度时直接全部读出。这部分可以不理。
      

  4.   

    汉字的值范围: 0x4e00 - 0x9fa5if ( '懒' >= 0x4e00 && '懒' <= 0x9fa5 )
    {
        //汉字
    }if ( '懒' >= '\u4e00' && '懒' <= '\u9fa5' )
    {
        //汉字
    }剩下的自己算...
      

  5.   

    ^o^ 正则: @"[\u4e00-\u9fa5]"
      

  6.   

    回复:shinaterry 
    我也是差不多这样做,当对于5楼提到的向后跳很多个单位的问题,就需要运行很久,而且cpu占用很高
      

  7.   

    这样的工作应该交由新线程去做...参考代码:private void Dowork()
    {
        while (true)
        {
            //此处执行操作.        Thread.Sleep(1); //累了, 休息一下...
        }
    }Thread T = new Thread(new ThreadStart(Dowork));T.IsBackground = true;T.Start();^o^