fs模块是对于文件,和文件夹进行操作
关于flag
通过设置读写文件API的flag属性,我们能控制我们操作文件的方式以及一些操作细节。
基本分类
首先我们要知道一个文件的操作方式主要分为哪几种:
- r : 读文件
- w : 写文件
- a : 追加
当我们调用read系的API时,默认的flag即为r,同样,当我们调用write系的API时,默认的flag即为w。其中w和a的区别在于。
w和a的区别
- w每次会清空文件,a则是向里添加。
- 文件不存在时w会创建文件,而a则会报错。
修饰操作
So,这些flag最基础的作用是标识我们这个操作是读文件还是写文件。但flag的作用不仅于此,我们还能在此基础之上添加一些辅助标识来定制一些我们读写文件时的细节操作。
其中若添上+表示对基本的操作方式进行取反加强(如果是写就还能读,如果是读就还能写),如果是x则就是排他。
r+ 读取并写入 文件不存在报错
rs 同步读取文件并忽略缓存
wx 排他写入文件
w+ 读取并写入文件,不存在则创建,存在则清空 和r+区别在于不会报错会创建不创建的文件
wx+ 和w+类似 其他方式打开
ax 排他
a+ 读取并追加写入,不存在则创建 和w+相比是不会覆盖
ax+ 作用于a+类似,但是以排他方式打开文件
容易记混淆的是创不创建报不报错,我们要注意即使r 用了+ 也并不能在文件不创在时创建一个文件,相比之下a则是可以的,但a+相较于w+它永远保持它追加的本质,不会像w清空再写入。
文件操作
打开文件,读取文件,写入文件,删除文件
写入文件
语法
以下为异步模式下写入文件的语法格式:
// fs.writeFile(filename,data,[options],callback);
var w_data = '这是一段通过fs.writeFile函数写入的内容;\r\n';
var w_data = new Buffer(w_data);
/**
* filename, 必选参数,文件名
* data, 写入的数据,可以字符或一个Buffer对象
* [options],flag,mode(权限),encoding
* callback 读取文件后的回调函数,参数默认第一个err,第二个data 数据
*/
fs.writeFile(__dirname + '/test.txt', w_data, {flag: 'a'}, function (err) {
if(err) {
console.error(err);
} else {
console.log('写入成功');
}
});
writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
var fs = require("fs");
console.log("准备写入文件");
fs.writeFile('input.txt', '我是通 过fs.writeFile 写入文件的内容', function(err) {
if (err) {
return console.error(err);
}
console.log("数据写入成功!");
console.log("--------我是分割线-------------")
console.log("读取写入的数据!");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取文件数据: " + data.toString());
});
});
取读文件
读取文件有同步,和异步两种方法
//readFile(filename,[options],callback);
/**
* filename, 必选参数,文件名
* [options],可选参数,可指定flag(文件操作选项,如r+ 读写;w+ 读写,文件不存在则创建)及encoding属性
* callback 读取文件后的回调函数,参数默认第一个err,第二个data 数据
*/
fs.readFile(__dirname + '/test.txt', {flag: 'r+', encoding: 'utf8'}, function (err, data) {
if(err) {
console.error(err);
return;
}
console.log(data);
});
案例:
var fs = require("fs");
// 异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
});
// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());
console.log("程序执行完毕。");
4、打开文件
// fs.open(filename, flags, [mode], callback);
/**
* filename, 必选参数,文件名
* flags, 操作标识,如"r",读方式打开
* [mode],权限,如777,表示任何用户读写可执行
* callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
*/
fs.open(__dirname + '/test.txt', 'r', '0666', function (err, fd) {
console.log(fd);
});
5、读文件,读取打开的文件内容到缓冲区中;
//fs.read(fd, buffer, offset, length, position, callback);
/**
* fd, 使用fs.open打开成功后返回的文件描述符
* buffer, 一个Buffer对象,v8引擎分配的一段内存
* offset, 整数,向缓存区中写入时的初始位置,以字节为单位
* length, 整数,读取文件的长度
* position, 整数,读取文件初始位置;文件大小以字节为单位
* callback(err, bytesRead, buffer), 读取执行完成后回调函数,bytesRead实际读取字节数,被读取的缓存区对象
*/
fs.open(__dirname + '/test.txt', 'r', function (err, fd) {
if(err) {
console.error(err);
return;
} else {
var buffer = new Buffer(255);
console.log(buffer.length);
//每一个汉字utf8编码是3个字节,英文是1个字节
fs.read(fd, buffer, 0, 9, 3, function (err, bytesRead, buffer) {
if(err) {
throw err;
} else {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
//读取完后,再使用fd读取时,基点是基于上次读取位置计算;
fs.read(fd, buffer, 0, 9, null, function (err, bytesRead, buffer) {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
});
}
});
}
});
6、写文件,将缓冲区内数据写入使用fs.open打开的文件
//fs.write(fd, buffer, offset, length, position, callback);
/**
* fd, 使用fs.open打开成功后返回的文件描述符
* buffer, 一个Buffer对象,v8引擎分配的一段内存
* offset, 整数,从缓存区中读取时的初始位置,以字节为单位
* length, 整数,从缓存区中读取数据的字节数
* position, 整数,写入文件初始位置;
* callback(err, written, buffer), 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象
*/
fs.open(__dirname + '/test.txt', 'a', function (err, fd) {
if(err) {
console.error(err);
return;
} else {
var buffer = new Buffer('写入文件数据内容');
//写入'入文件'三个字
fs.write(fd, buffer, 3, 9, 12, function (err, written, buffer) {
if(err) {
console.log('写入文件失败');
console.error(err);
return;
} else {
console.log(buffer.toString());
//写入'数据内'三个字
fs.write(fd, buffer, 12, 9, null, function (err, written, buffer) {
console.log(buffer.toString());
})
}
});
}
});
参考:
http://www.runoob.com/nodejs/nodejs-fs.html
http://www.cnblogs.com/wushanbao/p/7003308.html
https://juejin.im/post/5ab0f8135188255565345891