fs 模块简介
全称是file system(文件系统),它是NodeJS提供的文件操作API,用于对系统文件及目录进行读写操作,是一个非常重要的模块,对文件的操作都基于它。
该模块的所有方法都有同步和异步两种方式。
明确:
- 使用异步代码 :需要在服务器运行期反复执行业务逻辑的代码。
原因:同步代码在执行时期,服务器将停止响应,因为 Node.js 是单线程。 - 使用同步代码 :服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时。
原因:这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。
fs 模块的常用操作
前置知识 :
- 文件的权限位 mode
权限项 | 读 | 写 | 执行 | 无权限 |
---|---|---|---|---|
字符表示 | r | w | x | - |
数字表示 | 4 | 2 | 1 | 0 |
- 标识位 flag
代表着对文件的操作方式,如可读、可写、既可读又可写等
参数 | 说明 |
---|---|
‘a’ | 打开文件用于追加。如果文件不存在,则创建该文件。 |
‘ax’ | 与 ‘a’ 相似,但如果路径存在则失败。 |
‘a+’ | 打开文件用于读取和追加。如果文件不存在,则创建该文件。 |
‘ax+’ | 与 ‘a+’ 相似,但如果路径存在则失败。 |
‘as’ | 以同步模式打开文件用于追加。如果文件不存在,则创建该文件。 |
‘as+’ | 以同步模式打开文件用于读取和追加。如果文件不存在,则创建该文件。 |
‘r’ | 打开文件用于读取。如果文件不存在,则会发生异常。 |
‘r+’ | 打开文件用于读取和写入。如果文件不存在,则会发生异常。 |
‘rs+’ | 以同步模式打开文件用于读取和写入。指示操作系统绕开本地文件系统缓存。这对于在 NFS 挂载上打开文件非常有用,因为它允许跳过可能过时的本地缓存。 它对 I/O 性能有非常实际的影响,因此除非需要,否则不建议使用此标志。这不会将 fs.open() 或 fsPromises.open() 转换为同步的阻塞调用。 如果需要同步操作,则应使用 fs.openSync() 之类的操作。 |
‘w’ | 打开文件用于写入。创建文件(如果它不存在)或截断文件(如果存在)。 |
‘wx’ | 与 ‘w’ 相似,但如果路径存在则失败。 |
‘w+’ | 打开文件用于读取和写入。创建文件(如果它不存在)或截断文件(如果存在)。 |
‘wx+’ | 与 ‘w+’ 相似,但如果路径存在则失败。 |
-
文件描述符 fd
操作系统为每个 打开的 文件分配的一个数值标识,文件操作时用它来识别与追踪每个特定的文件
记忆技巧:
将mode理解为名词,flag理解为动词。“+” :取反
“x” : 排他
“s” : 同步
“a”:追加
导入fs:
var fs = require("fs");
1、打开文件
异步打开文件的语法格式为:
fs.open(path, flags[, mode], callback);
参数说明:
path:文件的路径
flags:文件操作方式。
mode:设置文件模式(权限)。
callback:回调函数,带有两个参数如:callback(err, fd)。
同步打开文件的语法格式为:
fs.openSync(path, flags[, mode])
2、关闭文件
异步关闭文件的语法格式为:
fs.close(fd, callback);
参数说明:
fd:通过 fs.open() 方法返回的文件描述符。
callback:回调函数,除了可能的异常,完成回调没有其他参数。
3、读文件
异步读取文件的语法格式为:
fs.read(fd, buffer, offset, length, position, callback)
参数说明:
buffer:是数据写入的缓冲区。
offset:指定要写入的 buffer 位置。一般它的值我们写为 0。
length:是一个整数,指定要读取的字节数。
position:指定从文件中开始读取的位置。 如果 position 为 null,则从当前文件位置读取数据,并更新文件位置。
callback:回调函数,有三个参数 err, bytesRead, buffer。
- err 为错误信息
- bytesRead 表示读取的字节数
- buffer 为缓冲区对象。
4、写文件
异步写入文件的语法格式为:
fs.write(fd, buffer, offset, length, position, callback);
参数说明:
length:是一个整数,指定要写入的字节数。
position 指定应该写入此数据的文件开头的偏移量。 如果 typeof position !== ‘number’,则从当前位置写入数据。
callback:回调有三个参数 (err, bytesWritten, buffer),其中 bytesWritten 指定从 buffer 写入的字节数。
fs.read 和 fs.write 需要结合 fs.open 得到文件句柄来使用,我们再介绍另外一种读写方式。
3(2)、用fs.readFile异步读取文件:
fs.readFile(path,[options], callback);
参数说明:
options:该参数是一个对象,包含{encoding,flag}。
-
encoding 默认值为 null
-
flag 默认值为 ‘r’。
callback:回调有两个参数 (err, data),其中 data 为要写入文件的数据。
4(2)、用fs.writeFile异步写入文件:
fs.writeFile(file, data,[options], callback);
参数说明:
file:文件名或文件描述符。
data:要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
options:该参数是一个对象,包含 {encoding, mode, flag}。
- encoding 默认值为:‘utf8’
- mode 默认值为 0o666
- flag 默认为 ‘w’。
callback:回调有一个参数 err。
注:
异步追加内容还有一个专门的方法叫fs.appendFile。
5、获取文件信息
异步获取文件信息的格式为:
fs.stat(path, callback);
参数说明:
callback:回调函数,带有两个参数:(err, stats), stats 是 fs.Stats 对象。
可以通过 stats 中提供d的方法判断文件的相关属性。
6、异步截取文件
异步截取文件的格式为:
fs.ftruncate(fd[, length], callback);
参数说明:
length:文件内容截取的长度,默认为 0。
callback:除了可能的异常,完成回调没有其他参数。
7、修改文件名
异步的修改文件名的语法为:
fs.rename(oldPath, newPath, callback);
参数说明:
oldPath:原来的文件名字。
newPath:新的文件名字。
callback:回调函数,除了可能的异常,完成回调没有其他参数。
8、删除文件
异步删除文件的语法格式为:
fs.unlink(path, callback);
参数说明:
callback: 除了可能的异常,完成回调没有其他参数。
9、新建目录
异步创建目录的语法为:
fs.mkdir(path[, options], callback);
参数说明:
options:有两个参数。
-
recursive 表示是否以递归的方式创建目录,默认为 false。
-
mode 设置目录权限,Windows 上不支持。默认为 0o777。
callback:回调函数,除了可能的异常,完成回调没有其他参数。
10、读取目录
异步读取目录的语法为:
fs.readdir(path[, options], callback);
参数说明:
options:有两个参数 encoding,withFileTypes。
-
encoding 默认值为 ‘utf8’
-
withFileTypes 默认值为 false。
callback : 回调函数,有两个参数 err, files。files 为目录下的文件数组列表。
11、删除目录
异步删除目录的语法为:
fs.rmdir(path, callback);
参数说明:
callback:回调函数,除了可能的异常,完成回调没有其他参数。