} else if (util.isString(options)) {
options = { encoding: options, flag: 'r' };
} else if (!util.isObject(options)) {
throw new TypeError('Bad arguments');
}
var encoding = options.encoding;
assertEncoding(encoding);
//判断encoding是否为当前支持的编码类型,如果不支持,则抛出一个异常,停止执行。
//判断encoding的方法在Buffer模块中,请参考前面的文章,文章地址,请在源码分析的结尾查看。
// first, stat the file, so we know the size.
var size;
var buffer; // single buffer with file data
var buffers; // list for when size is unknown
var pos = 0;
var fd;
//参数验证成功,开始执行读取数据的,设置flag默认值
var flag = options.flag || 'r';
//首先根据路径,打开文件,open的使用,请参考前面的文章
fs.open(path, flag, 438 /*=0666*/, function(er, fd_) {
//如果失败,那么获取到失败的error对象,并返回该对象
if (er) return callback(er);
//记录打开文件的文件描述符
fd = fd_;
//使用fstat,查看当前打开文件的一些基本信息。
//fstat获取到的信息,请向前翻看。
fs.fstat(fd, function(er, st) {
if (er) {
//如果在执行fstat时失败,则执行关闭文件的操作,
//关闭之后,把错误信息,传入readFile的回调函数
return fs.close(fd, function() {
callback(er);
});
}
size = st.size;
//根据文件的大小,执行不同的操作
//如果为空文件,则重新定义一个空的buffers,执行read文件的方法
if (size === 0) {
// the kernel lies about many files.
// Go ahead and try to read some bytes.
buffers = [];
return read();
}
//如果文件内容,大于内存所能保存的最大量,则抛出一个范围异常。
if (size > kMaxLength) {
var err = new RangeError('File size is greater than possible Buffer: ' + '0x3FFFFFFF bytes');
return fs.close(fd, function() {
callback(err);
});
}
//否则,定义一个与内容相当大小的Buffer对象,开始执行read方法
buffer = new Buffer(size);
read();
});
});
function read() {
//根据size的不同,执行两个方法
//当读取成功时,执行afterRead方法。
//其中,size,buffer,fd,pos,等都是父级作用域的变量
if (size === 0) {
buffer = new Buffer(8192);
fs.read(fd, buffer, 0, 8192, -1, afterRead);
} else {
fs.read(fd, buffer, pos, size - pos, -1, afterRead);
}
}
function afterRead(er, bytesRead) {
if (er) {
//读取文件失败时,根据失败时的错误对象,执行readFile的回调函数
return fs.close(fd, function(er2) {
return callback(er);









