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