如题,一般的读取文件方法都是顺序读取的,比如用FileStream打开文件,然后StreamReader.ReadLine()按顺序逐行读取,这样感觉效率比较低,因为如果要做增量读取的话,会消耗大量时间和资源在读取重复的数据。比如从另一台计算机(远程)的共享文件夹中读取一个文件,对应本机有一个一样的文件,每隔一段时间就比较这两个文件,如果远程计算机的文件有增加内容(当然都是从文件尾部追加),则要把新增的部分读取并追加到本机的文件上。逐行顺序读取再判断大小是可以定位到新增加的行并开始读取,但是这样的方法在该文件只有几行或几十行的时候效率还可以,如果是几万行或几十万行的话,可想而知,只增加一两行,却要依次读几十万行,明显不太合理。所以,请教各位达人,有没有什么方法,可以实现直接读取一个文件的增量?

解决方案 »

  1.   

    5秒读一次,从取新增的行。        private void GetNewTxt(string filename)
            {
                    long bytcount = 0;
                    while (true)
                    {
                       
                        FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
                        byte[] bytcontent = new byte[fs.Length];
                        if (fs.CanRead)
                        {
                            StreamReader sr = new StreamReader(fs);
                            long dataLengthToRead = fs.Length;//获取新的文件总大小                        if (dataLengthToRead > 0 && dataLengthToRead > bytcount)
                            {
                                fs.Seek(bytcount, SeekOrigin.Begin);
                                int lengthRead = fs.Read(bytcontent, 0, Convert.ToInt32(dataLengthToRead - bytcount));//读取的大小
                                richTextBox1.AppendText(System.Text.Encoding.Default.GetString(bytcontent));//载入文本
                                dataLengthToRead -= lengthRead;
                            }
                            
                            sr.Close();
                            fs.Close();
                            DateTime dtstart = DateTime.Now; // 获取当前时间
                            DateTime dtend;
                            double diff = 0;
                            while (diff < 5)//5秒执行一次
                            {
                                dtend = DateTime.Now;
                                TimeSpan ts = dtend.Subtract(dtstart);
                                diff = (double)ts.TotalSeconds;
                                Application.DoEvents();
                            }
                          
                        }
                        bytcount = bytcontent.Length;//记录当次总字节数
                    }
            }
      

  2.   

     1.选确定本机文件的行数。
     string[] sr = File.ReadAllLines(apath);
     int alines= sr.Length;2.打开共享文件读本机文件没有的行并追加到了本机文件中
    string[] strs = File.ReadAllLines(bpath);
    int blines= strs.Length;
    for(int i=lines;i<blines);i++)
    {
     File.AppendAllText(apath,strs[i]);}
      

  3.   

    流对象可以指定读取的位置,不过它是基于全部加载的前提的。快速读取还是要使用内存映射文件http://topic.csdn.net/u/20111106/13/0c699f1c-6f6b-4ada-8850-859a1c41ea81.html
      

  4.   

    fseek(距起始位置长度,起始位置),可以根据行数和每行字节算出来吧
      

  5.   

    难道你不知道FileStream里有个seek是用来定位文件读取位置的吗?
    比如:旧文件AO的大小是1024B,新文件AN是1056B,
    FileStream fs = new FileStream("C:\\AN.dat", FileMode.OpenOrCreate);
    fs.Seek(0, 1024, soBegin);
    byte[] bdata = new byte[1056-1024];
    fs.Read(bdata, 0, bdata.Length);
    bdata中就是新数据了。