//这里的判断和readFile基本完全一样,只是默认值不一样而已
if (util.isFunction(options) || !options) {
options = { encoding: 'utf8', mode: 438 /*=0666*/, flag: 'w' };
} else if (util.isString(options)) {
options = { encoding: options, mode: 438, flag: 'w' };
} else if (!util.isObject(options)) {
throw new TypeError('Bad arguments');
}
//判断当前设置的encoding是否为当前支持的encoding,如果不支持,会抛出一个异常,
//停止继续向下执行
assertEncoding(options.encoding);
//默认信息设置好,则打开文件,执行写入操作
var flag = options.flag || 'w';
fs.open(path, flag, options.mode, function(openErr, fd) {
if (openErr) {
//打开失败时,把失败原因,传入writeFile的回调函数
if (callback) callback(openErr);
}else {
//打开成功时,要把需要写入的data信息,改为buffer对象
var buffer = util.isBuffer(data) ? data : new Buffer('' + data,options.encoding || 'utf8');
//判断是否打开的方式,是否是追加模式,
//这里让我很疑惑的一个问题是,为什么这里要用正则表达式?
//这样简单的判断,直接食用indexOf,不是会有更高的效率?
// var position = flag.indexOf("a") == -1 ? 0 : null;
var position = /a/.test(flag) ? null : 0;
//准备好了所有的信息,则开始使用writeAll方法,写入文件
writeAll(fd, buffer, 0, buffer.length, position, callback);
}
});
};
OK,writeFile的源码就是这样了,其实这里还有一个就是追加到文件的方法,命名为appendFile,这个就不单独来写了,看下源码,应该就能懂了。
fs.appendFile = function(path, data, options, callback_) {
var callback = maybeCallback(arguments[arguments.length - 1]); if (util.isFunction(options) || !options) {
options = { encoding: 'utf8', mode: 438 /*=0666*/, flag: 'a' };
} else if (util.isString(options)) {
options = { encoding: options, mode: 438, flag: 'a' };
} else if (!util.isObject(options)) {
throw new TypeError('Bad arguments');
}
if (!options.flag)
options = util._extend({ flag: 'a' }, options);
//调用的writeFile
fs.writeFile(path, data, options, callback);
};
appendFile的源码,就更没有什么新东西了,只是做了一个判断,然后给flag标签添加了一个a属性值,之后就直接调用的weiteFile的方法了。
总结
关于nodejs的操作文件,是比较重要的一个概念,所以包含的信息,也是比较多的,本篇依然是在之前open,read,write等的基础上,执行的再一次的封装,不属于新的概念,只是为了能让使用者更简单的使用读写文件的功能而已。后面继续在看一些其他的操作文件的API的功能及其实现。









