文件系统操作

// 引入fs模块
const fs = require("fs");
1
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

关闭文件

// 这个fd 通过 fs.open() 方法返回的文件描述符。
fs.close(fd, callback);
1
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

写文件

同步

fs.writeFileSync(file, newdata, options);
1

异步

// 需要注意一点,如果写入的是数组,对象类型的数据需要先转字符串
fs.writeFile("./新文件.txt", "我是新内容", (err) => {
  console.log(err);
});
1
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

重命名文件

同步

fs.renameSync(oldPath, newPath);
1

异步

fs.rename("./1.txt", "新文件.txt", (err) => {
  if (err) throw err;
  console.log("重命名完成");
});
1
2
3
4

删文件

异步

fs.unlink("文件", (err) => {
  if (err) throw err;
  console.log("已成功地删除文件");
});
1
2
3
4

同步

// try---catch只是为了容错
try {
  fs.unlinkSync("文件");
  console.log("已成功地删除文件");
} catch (err) {
  // 处理错误
}
1
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

创建文件夹

语法

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

检测路径是否正常

语法

fs.existsSync(path)

if (fs.existsSync("文件")) {
  console.log("该路径已存在");
}
1
2
3
Last Updated:
Contributors: websong