fs
面试官:说说�?Node 中的 fs模块的理�? 有哪些常用方�?

一、是什�?
fs(filesystem),该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包�?
可以说,所有与文件的操作都是通过fs核心模块实现
导入模块如下�?
1 | const fs = require('fs'); |
这个模块对所有文件系统操作提供异步(不具有sync 后缀)和同步(具�?sync 后缀)两种操作方式,而供开发者选择
二、文件知�?
在计算机中有关于文件的知识:
- 权限�?mode
- 标识�?flag
- 文件描述�?fd
权限�?mode

针对文件所有者、文件所属组、其他用户进行权限分配,其中类型又分成读、写和执行,具备权限�?�?�?,不具备权限�?
如在linux查看文件权限位:
1 | drwxr-xr-x�? PandaShen�?97121�? Jun 28 14:41 core |
在开头前十位中,d为文件夹,-为文件,后九位就代表当前用户、用户所属组和其他用户的权限位,按每三位划分,分别代表读(r)、写(w)和执行(x),- 代表没有当前位对应的权限
标识�?
标识位代表着对文件的操作方式,如可读、可写、即可读又可写等等,如下表所示:
| 符号 | 含义 |
|---|---|
| r | 读取文件,如果文件不存在则抛出异常�? |
| r+ | 读取并写入文件,如果文件不存在则抛出异常�? |
| rs | 读取并写入文件,指示操作系统绕开本地文件系统缓存�? |
| w | 写入文件,文件不存在会被创建,存在则清空后写入�? |
| wx | 写入文件,排它方式打开�? |
| 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
结果为返回文件的内容
1 | const fs = require("fs"); |
fs.readFile
异步读取方法 readFile �?readFileSync 的前两个参数相同,最后一个参数为回调函数,函数内有两个参�?err(错误)�?data(数据),该方法没有返回值,回调函数在读取文件成功后执行
1 | const fs = require("fs"); |
文件写入
writeFileSync
同步写入,有三个参数�?
第一个参数为写入文件的路径或文件描述�?
第二个参数为写入的数据,类型�?String �?Buffer
第三个参数为 options,默认值为 null,其中有 encoding(编码,默认�?utf8)�?flag(标识位,默认为 w)和 mode(权限位,默认为 0o666),也可直接传入 encoding
1 | const fs = require("fs"); |
writeFile
异步写入,writeFile �?writeFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参�?err(错误),回调函数在文件写入数据成功后执�?
1 | const fs = require("fs"); |
文件追加写入
appendFileSync
参数如下�?
- 第一个参数为写入文件的路径或文件描述�?- 第二个参数为写入的数据,类型�?String �?Buffer
- 第三个参数为 options,默认值为 null,其中有 encoding(编码,默认�?utf8)�?flag(标识位,默认为 a)和 mode(权限位,默认为 0o666),也可直接传入 encoding
1 | const fs = require("fs"); |
appendFile
异步追加写入方法 appendFile �?appendFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参�?err(错误),回调函数在文件追加写入数据成功后执�?
1 | const fs = require("fs"); |
文件拷贝
copyFileSync
同步拷贝
1 | const fs = require("fs"); |
copyFile
异步拷贝
1 | const fs = require("fs"); |
创建目录
mkdirSync
同步创建,参数为一个目录的路径,没有返回值,在创建目录的过程中,必须保证传入的路径前面的文件目录都存在,否则会抛出异�?
1 | // 假设已经有了 a 文件夹和 a 下的 b 文件�?fs.mkdirSync("a/b/c") |
mkdir
异步创建,第二个参数为回调函�?
1 | fs.mkdir("a/b/c", err => { |