C#怎么实现从一个文件的指定行开始读取数据


如题,一般的读取文件方法都是顺序读取的,比如用FileStream打开文件,然后StreamReader.ReadLine()按顺序逐行读取,这样感觉效率比较低,因为如果要做增量读取的话,会消耗大量时间和资源在读取重复的数据。

比如从另一台计算机(远程)的共享文件夹中读取一个文件,对应本机有一个一样的文件,每隔一段时间就比较这两个文件,如果远程计算机的文件有增加内容(当然都是从文件尾部追加),则要把新增的部分读取并追加到本机的文件上。

逐行顺序读取再判断大小是可以定位到新增加的行并开始读取,但是这样的方法在该文件只有几行或几十行的时候效率还可以,如果是几万行或几十万行的话,可想而知,只增加一两行,却要依次读几十万行,明显不太合理。

所以,请教各位达人,有没有什么方法,可以实现直接读取一个文件的增量?

12 个解决方案

#1


对于大文件,用内存映射,以 #10#13为换行标识,自己找

#2


该回复于2011-11-10 09:04:14被版主删除

#3


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;//记录当次总字节数
                }
        }

#4


这个方法只取新增的行,但是文件是肯定要载入的,效率已经很好了。我前面不是回答了嘛!没测?

#5


对比几万行或几十万行内容中不同的内容的时间要是不是远远超过文件拷贝的时间?
是的话,是不是换种思路?

不懂,路过。

#6


这个有点不好搞啊

每次有增量时记录时间吧。

#7


我这个做了读取判断,是否可读,如果可读在时间范围内就读取,如果你要定时去读,那更好办直接对比时间久得了。

#8


 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]);

}

#9


流对象可以指定读取的位置,不过它是基于全部加载的前提的。

快速读取还是要使用内存映射文件

http://topic.csdn.net/u/20111106/13/0c699f1c-6f6b-4ada-8850-859a1c41ea81.html

#10


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

#11


难道你不知道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中就是新数据了。

#12


直接拷贝文件不符合需求,因为并不单单只是读取增加的新行,还要对新增的每一行进行分析,分析完了增加到本地文件同时上传指定位置或保存需要的内容到数据库;

判断时间的方式也不好,万一时间被人改动了,不免会出现异常;

3、8、11楼的方法可供参考,谢谢,具体情况明天测试看看;

1、9楼的内存映射方式视乎更高级一些,有助于提高水平
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告