一、基础概念

fs(fileSystem),该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。
可以说,所有与文件的操作都是通过fs核心模块实现的。
导入模块如下:

  1. const fs = require('fs');

这个模块对所有的文件系统操作提供 异步 和 同步 两种操作方式,供开发者选择。

二、文件知识

在计算机中有关与文件的知识:

  • 权限位 mode
  • 标识位 flag
  • 文件描述位 fd

    权限位 mode

    | 权限分配 | 文件所有者 | | | 文件所属组 | | | 其他用户 | | | | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | | 权限项 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 | | 字符表示 | r | w | x | r | w | x | r | w | x | | 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |

针对文件所有者、文件所属组、其他用户进行权限分配,其中类型又分成读、写和执行,具备权限位4、2、1,不具备权限为0。

标识位

标识位代表着对文件的操作方式,如可读、可写、既可读有可写等等,如下表:

符号 含义
r 读取文件,若文件不存在则抛出异常
r+ 读取并写入文件,若文件不存在则抛出异常
rs 读取并写入文件,指示操作系统绕开本地文件系统缓存
w 写入文件,文件不存在则被创建,存在则清空后写入
wx 写入文件,排它方式打开
w+ 读取并写入文件,文件不存在则创建文件,存在则清空后写入
a 追加写入,文件不存在则创建文件
ax 与 a 相似,排他方式打开
a+ 读取并追加写入,不存在则创建
ax+ 与 a+ 类似,排它方式打开

文件描述位 fd

操作系统会为每个打开的文件分配一个名为文件描述符的数值标识,文件操作使用这些文件描述符来识别与追踪每个特定的文件
Window系统使用了一个不同但概念类似的机制来追踪资源,为方便用户,NodeJS抽象了不同操作系统间的差异,为所有打开的文件分配了数值的文件描述符
NodeJS中,每操作一个文件,文件描述符是递增的,文件描述符一般从 3 开始,因为前面有 0、1、2三个比较特殊的描述符,分别代表process.stdin(标准输入)、process.stdout(标准输出)和 process.stderr(错误输出)。

三、方法

下面针对fs模块常用的方法进行展开:

  • 文件读取
  • 文件写入
  • 文件追加写入
  • 文件拷贝
  • 创建目录

    文件读取

    **fs.readFileSync**
    同步读取,参数如下:

  • 第一个参数为读取文件的路径或文件描述符

  • 第二个参数为 options,默认值为 null,其中有 encoding(编码,默认为 null)和 flag(标识位,默认为 r),也可以直接传入 encoding.
  • 结果为返回文件的内容 ```javascript const fs = require(“fs”);

let buf = fs.readFileSync(“1.txt”); let data = fs.readFileSync(“1.txt”, “utf8”);

console.log(buf); // console.log(data); // Hello

  1. `**fs.readFile**`<br />异步读取方法`readFile``readFileSync`的前两个参数相同,最后一个参数为回调函数,函数内有两个参数`err``data`,该方法没有返回值,回调函数在读取文件成功后执行。
  2. ```javascript
  3. const fs = require("fs");
  4. fs.readFile("1.txt", "utf8", (err, data) => {
  5. if(!err){
  6. console.log(data); // Hello
  7. }
  8. });

文件写入

**fs.writeFileSync**
同步写入,有三个参数:

  • 第一个参数为写入文件的路径或文件描述符
  • 第二个参数为写入的数据,类型为 String 或 Buffer
  • 第三个参数为 options,默认值为 null,其中有 encoding(编码,默认为 utf8)、 flag(标识位,默认为 w)和 mode(权限位,默认为 0o666),也可直接传入 encoding ```javascript const fs = require(“fs”);

fs.writeFileSync(“2.txt”, “Hello world”); let data = fs.readFileSync(“2.txt”, “utf8”);

console.log(data); // Hello world

  1. `**fs.writeFile**`<br />异步写入,writeFile writeFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参数 err(错误),回调函数在文件写入数据成功后执行。
  2. ```javascript
  3. fs.writeFile("2.txt", "Hello world", err => {
  4. if (!err) {
  5. fs.readFile("2.txt", "utf8", (err, data) => {
  6. console.log(data); // Hello world
  7. });
  8. }
  9. });

文件追加写入

**fs.appendFileSync**
参数如下:

  • 第一个参数为写入文件的路径或文件描述符
  • 第二个参数为写入的数据,类型为 String 或 Buffer
  • 第三个参数为 options,默认值为 null,其中有 encoding(编码,默认为 utf8)、 flag(标识位,默认为 a)和 mode(权限位,默认为 0o666),也可直接传入 encoding ```javascript const fs = require(“fs”);

fs.appendFileSync(“3.txt”, “ world”); let data = fs.readFileSync(“3.txt”, “utf8”);

  1. `**fs.appendFile**`<br />异步追加写入方法 appendFile appendFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参数 err(错误),回调函数在文件追加写入数据成功后执行。
  2. ```javascript
  3. const fs = require("fs");
  4. fs.appendFile("3.txt", " world", err => {
  5. if (!err) {
  6. fs.readFile("3.txt", "utf8", (err, data) => {
  7. console.log(data); // Hello world
  8. });
  9. }
  10. });

文件拷贝

**fs.copyFileSync**
同步拷贝

  1. const fs = require("fs");
  2. fs.copyFileSync("3.txt", "4.txt");
  3. let data = fs.readFileSync("4.txt", "utf8");
  4. console.log(data); // Hello world

**fs.copyFile**
异步拷贝

  1. const fs = require("fs");
  2. fs.copyFile("3.txt", "4.txt", () => {
  3. fs.readFile("4.txt", "utf8", (err, data) => {
  4. console.log(data); // Hello world
  5. });
  6. });

创建目录

fs.mkdirSync

同步创建,参数为一个目录的路径,没有返回值,在创建目录的过程中,必须保证传入的路径前面的文件目录都存在,否则会抛出异常。

  1. // 假设已经有了 a 文件夹和 a 下的 b 文件夹
  2. fs.mkdirSync("a/b/c")

**fs.mkdir**
异步创建,第二个参数为回调函数

  1. fs.mkdir("a/b/c", err => {
  2. if (!err) console.log("创建成功");
  3. });