如何方便的读文本文件的最后一行?

daguohuai 2009-04-20 01:35:42
方便的意思,就是快,最好不用循环,也不要把文件都读到内存里。简单来说就是可以直接把读取指针放到最后一行。

因为文件很大,不能都读进内存,所以只能一行一行处理。

但是只有读到最后一行,才知道文件是否完整,也就是必须在处理前先把最后一行读出来,验证一下。

如果不完整,就不能进行处理(因为处理过程不能回退的)。

所以这样看来只能做两次循环,第一次什么也不做,只是为了读出最后一行来做个验证,如果通过了,再从头来一次进行处理。

由于文件很大,读两遍势必会很慢。有没有什么好的办法,可以不做循环直接把最后一行读出来?

注意:如果把第一遍读的先存起来也是不行的,因为太消耗内存了。非要读一行处理一行才行。
...全文
399 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaliu123 2009-10-14
  • 打赏
  • 举报
回复
GZ
freewind0521 2009-04-20
  • 打赏
  • 举报
回复
如果你能确定最后一行的最大长度,可以读取文件结尾开始的最大长度的数据,再自己分析。

System.IO.FileStream fs = new System.IO.FileStream(文件路径, System.IO.FileMode.Open);
fs.Seek(最大长度, System.IO.SeekOrigin.End);
System.IO.StreamReader sr = new System.IO.StreamReader(fs, 编码);
string 要分析的数据 = sr.ReadToEnd();
fs.Close();
sr.Close();



justindreams 2009-04-20
  • 打赏
  • 举报
回复
1楼的方法可以尝试。
zgke 2009-04-20
  • 打赏
  • 举报
回复
给你个参考..这个是一个字节一个字节的读的..
FileStream _FileStream = new FileStream(@"C:\1.log", FileMode.Open, FileAccess.Read);

_FileStream.Position = _FileStream.Length - 2;
byte[] _ReadData=new byte[1];
while (true)
{
byte[] _EnterBytes =new byte[]{0x0D,0x0A};
byte[] _ReadBytes =new byte[2];
_FileStream.Read(_ReadBytes, 0, 2);

if (_EnterBytes[0] == _ReadBytes[0] && _EnterBytes[1] == _ReadBytes[1])
{
_ReadData = new byte[_FileStream.Length - _FileStream.Position];
_FileStream.Read(_ReadData, 0, _ReadData.Length);
break;
}
_FileStream.Position -= 3;
}

this.Text=System.Text.Encoding.Default.GetString(_ReadData);
daguohuai 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangqidong 的回复:]

FileInfo fi=new FileInfo("大文件");
FileStream fs = new FileStream("大文件");
StreamReader reader = new StreamReader(fs);
我的想法,
1.获取文件大小fi.Length
2.设置文件流Positions属性为legtn-500,也就是把文件指针定位在倒数500字节
3. reader.ReaderLine();string result=reader.ReaderLine(); 第一个readerLine读取到最后一个换行,第二个ReaderLine读取剩余的,也就是最后一行
4.当然,有可能后…
[/Quote]

这个办法不错,测试通过
readfuture 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangqidong 的回复:]

FileInfo fi=new FileInfo("大文件");
FileStream fs = new FileStream("大文件");
StreamReader reader = new StreamReader(fs);
我的想法,
1.获取文件大小fi.Length
2.设置文件流Positions属性为legtn-500,也就是把文件指针定位在倒数500字节
3. reader.ReaderLine();string result=reader.ReaderLine(); 第一个readerLine读取到最后一个换行,第二个ReaderLine读取剩余的,也就是最后一行
4.当然,有可能后…
[/Quote]
这个可以试试
tsp860901 2009-04-20
  • 打赏
  • 举报
回复
顶一下
yangqidong 2009-04-20
  • 打赏
  • 举报
回复

FileInfo fi=new FileInfo("大文件");
FileStream fs = new FileStream("大文件");
StreamReader reader = new StreamReader(fs);
我的想法,
1.获取文件大小fi.Length
2.设置文件流Positions属性为legtn-500,也就是把文件指针定位在倒数500字节
3. reader.ReaderLine();string result=reader.ReaderLine(); 第一个readerLine读取到最后一个换行,第二个ReaderLine读取剩余的,也就是最后一行
4.当然,有可能后面500字节中没有换行,也就是result为null,那就循环再提前500字节
.....

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧