以前只是在ajax的时候使用异步编程,这次通过node.js异步读文件,和以往的同步编程确实很不一样啊!
//File System var fs = require('fs'); //fd is the file descriptor used by the WriteStream. var logFd; //日志文件 var log = 'i_access.log'; //读取过程需要的 var buf, logSize, start = 0, length, offse = 0, logArr = '', LENGHT = 1024 * 1024;//每次读取的长度,1M //读取文件信息,获取文件长度 fs.stat(log, function(err, stats){ if(err) throw err; // console.log(JSON.stringify(stats)); logSize = stats.size; //打开文件 fs.open(log, 'r', 0666, function(err, fd){ if(err) throw err; logFd = fd; length = LENGHT < (logSize - offse) ? LENGHT : (logSize - offse); buf = new Buffer(length); //日志读取 readLog(); }); }); //日志读取 function readLog(){ //读取 fs.read(logFd, buf, start, length, offse, function(err){ if(err) throw err; //按行切分 logArr = buf.toString('utf8').split('\n'); var last = false; //判断是否是最后一次调用 if(offse + length < logSize){ //最后一行不完整,抛掉,下次在取 last = logArr.pop(); } //调用日志分析模块,对logArr做处理 logAnalysis(); //处理参数,准备下次调用 if(last !== false){ offse += length - last.length; length = LENGHT < (logSize - offse) ? LENGHT : (logSize - offse); buf = new Buffer(length); //递归读取 if(!lastRead){ readLog(); } } }); } //日志分析模块 function logAnalysis(){ //TODO:日志分析与读取...... console.log(logArr.length); console.log(logArr[0]); console.log(logArr[logArr.length - 1]); console.log('------'); } |