详解nodejs 文本操作模块-fs模块(三)

2020-06-17 07:10:33易采站长站整理

最简单的示例:


var fs = require("fs");

fs.writeFile('test.js',"新添加的数据",{flag:"a+"},function(err,data){
if(err){
console.log("readFile file error");
return false;
}

console.log(data);
});

这里说的示例,都是最简单的示例,参数什么的,好多都没有设置,因为在我看来,只要我能把源码中相关的信息看懂,那么关于这些API的使用,我就可以几乎找到它所有的使用方法,所以,在这里给出示例的时候,我都是给的一个最简单的示例,然后后面继续开始看下源码中的信息,在源码中,就可以把writeFile的使用方法,都能懂一些了。

writeFile源码

继续看下writeFile中的源码实现逻辑,让我们可以对writeFile有更深层次的了解。


function writeAll(fd, buffer, offset, length, position, callback) {
//判断最后一个是否为回调函数,如果不是,给一个默认的回调函数
//默认的回调函数,在使用者来说,是无法访问到的
callback = maybeCallback(arguments[arguments.length - 1]);

// write(fd, buffer, offset, length, position, callback)
//文件标志符是fd,需要写入的数据是buffer,真实写入数据,是从buffer的offset位置开始
//取长度为length的数据,写入到fd指向的文件中,position的位置处。
fs.write(fd, buffer, offset, length, position, function(writeErr, written) {
if (writeErr) {
//如果写入失败,则关闭文件,执行callback,传入失败信息保存对象
fs.close(fd, function() {
if (callback) callback(writeErr);
});
} else {
//written为保存的数据byte值,如果意见全部保存,则保存完成,关闭文件
if (written === length) {
fs.close(fd, callback);
} else {
//如果没有保存完毕,则更新offset,length,position的值,继续调用该方法,
//保存剩下的数据,直到把所有的数据保存成功为止。
offset += written;
length -= written;
position += written;
writeAll(fd, buffer, offset, length, position, callback);
}
}
});
}

fs.writeFile = function(path, data, options, callback) {
//判断最后一个是否为回调函数,如果不是,给一个默认的回调函数
var callback = maybeCallback(arguments[arguments.length - 1]);

//给options设置一些默认值,writeFile的第三个参数,只能是三种情况
//1:function,这个时候,options使用默认值,第三个参数为回调函数
//2:string类型,这个时候,第三个参数为encoding的属性值
//3:object类型,这个时候,表示options为一个完整的对象,可能包含也可能不包含encoding和flag属性
//如果不为上述的三种类型,那么直接抛出一个类型异常,停止执行