文件系统操作
// 引入fs模块
const fs = require("fs");
1
2
2
导读
所有的方法都有异步和同步,区别是同步的需要加 try 去容错,异步接收回调。
当使用 fs.open 打开文件时有多种打开方式,默认是"r",如果文件不存在报错。
那么余下的其他读写方式,第一个参数可以是一个文件地址,也可是 open 方法的数据对象,官网成为描述符。
打开文件
使用 open 打开的文件不会关闭,需要使用 close 方法,否则,下一次操作文件会包占用错误。 fs.open(path, flags[, mode], callback)
参数说明:
- path - 文件的路径。
- flags - 文件打开的行为。具体值详见下文。
- r 【默认模式】以读取模式打开文件。如果文件不存在抛出异常。
- r+ 以读写模式打开文件。如果文件不存在抛出异常。
- rs 以同步的方式读取文件。
- rs+ 以同步的方式读取和写入文件。
- w 以写入模式打开文件,如果文件不存在则创建。
- wx 类似 'w',但是如果文件路径存在,则文件写入失败。
- w+ 以读写模式打开文件,如果文件不存在则创建。
- wx+ 类似 'w+', 但是如果文件路径存在,则文件读写失败。
- a 以追加模式打开文件,如果文件不存在则创建。
- ax 类似 'a', 但是如果文件路径存在,则文件追加失败。
- a+ 以读取追加模式打开文件,如果文件不存在则创建。
- ax+ 类似 'a+', 但是如果文件路径存在,则文件读取追加失败。
- mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
- callback - 回调函数,带有两个参数如:callback(err, fd)。
例子
fs.open("input.txt", "r+", function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打开成功!");
});
1
2
3
4
5
6
2
3
4
5
6
关闭文件
// 这个fd 通过 fs.open() 方法返回的文件描述符。
fs.close(fd, callback);
1
2
2
读文件
一般我们使用下面两种快捷用法,但是早期版本的读只有 read,它和 close 都是配合着 fs.open 用的,所以说上面三个是历史元老了,不会在开发中频繁使用,因为用起来很繁琐,但是还是要知道一下。
同步
fs.readFileSync("./新文件.txt", "utf8");
1
异步
fs.readFile("./新文件.txt", "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
1
2
3
4
2
3
4
写文件
同步
fs.writeFileSync(file, newdata, options);
1
异步
// 需要注意一点,如果写入的是数组,对象类型的数据需要先转字符串
fs.writeFile("./新文件.txt", "我是新内容", (err) => {
console.log(err);
});
1
2
3
4
2
3
4
追加文件内容
数据会追加在元数据末尾。 异步地将数据追加到文件,如果文件尚不存在则创建该文件。 data 可以是字符串或 Buffer【二进制数据】。
// fs.appendFile(path, data[, options], callback)
fs.appendFile('message.txt', '追加的数据', (err) => {
if (err) throw err;
console.log('数据已追加到文件');
});
如果 options 是字符串,则它指定字符编码:
fs.appendFile('message.txt', '追加的数据', 'utf8', callback);
1
2
3
4
5
6
7
2
3
4
5
6
7
重命名文件
同步
fs.renameSync(oldPath, newPath);
1
异步
fs.rename("./1.txt", "新文件.txt", (err) => {
if (err) throw err;
console.log("重命名完成");
});
1
2
3
4
2
3
4
删文件
异步
fs.unlink("文件", (err) => {
if (err) throw err;
console.log("已成功地删除文件");
});
1
2
3
4
2
3
4
同步
// try---catch只是为了容错
try {
fs.unlinkSync("文件");
console.log("已成功地删除文件");
} catch (err) {
// 处理错误
}
1
2
3
4
5
6
7
2
3
4
5
6
7
看文件属性
同步
fs.statSync("新文件");
1
异步
fs.stat("新文件", (err, stats) => {
if (err) throw err;
console.log(`文件属性: ${JSON.stringify(stats)}`);
// 下面这两个算是常用得,判断文件或目录
console.log("如果是文件返回 true:", stats.isFile());
console.log("如果是目录返回 true", stats.isDirectory());
});
1
2
3
4
5
6
7
2
3
4
5
6
7
创建文件夹
语法
fs.mkdir(path[, options], callback)
参数 options
- path - 文件路径。
- options 参数可以是:
- recursive - 是否以递归的方式创建目录,默认为 false。
- mode - 设置目录权限,默认为 0777。
- callback - 回调函数,没有参数。
// tmp 目录必须存在
console.log("创建目录 /tmp/test/");
fs.mkdir("/tmp/test/", function(err) {
if (err) {
return console.error(err);
}
console.log("目录创建成功。");
});
// 如果父子路径都不存在就创建它
fs.mkdir("/tmp/a/apple", { recursive: true }, (err) => {
if (err) throw err;
});
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
检测路径是否正常
语法
fs.existsSync(path)
if (fs.existsSync("文件")) {
console.log("该路径已存在");
}
1
2
3
2
3