内置模块 fs
约 1872 字大约 6 分钟
2025-03-15
fs 全称为 file system
,称之为 文件系统
,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操 作。
常见的操作:
- 文件的读取、写入、移动、重命名、删除
- 文件夹的读取、写入、移动、重命名、删除
- 查看资源状态
引入 fs 模块
const fs = require("fs");
一、文件写入
文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile | 异步追加写入 |
appendFileSync | 同步追加写入 |
createWriteStream | 流式写入 |
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入:
- 下载文件
- 安装软件
- 保存程序日志,如 Git
- 编辑器保存文件
- 视频录制
当需要持久化保存数据 的时候,应该想到 文件写入
1、异步写入 writeFile
语法:
fs.writeFile(file, data[, options], callback)
参数说明:
- file: 文件名
- data: 待写入的数据
- options: 选项设置 (可选)
- callback: 写入回调
代码示例:
//将 『三人行,必有我师焉。』 写入到当前文件夹下的『座右铭.txt』文件中
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', err => {
//如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
if(err){
console.log(err);
return;
}
console.log('写入成功');
});
2、同步写入writeFileSync
语法
fs.writeFileSync(file, data[, options])
参数说明:
与 fs.writeFile
大体一致,只是没有 callback
参数
代码示例
try {
fs.writeFileSync("./座右铭.txt", "三人行,必有我师焉。");
} catch (e) {
console.log(e);
}
3、异步追加写入appendFile
语法
fs.appendFile(file, data[, options], callback)
参数说明:
- file: 文件名
- data: 待写入的数据
- options: 选项设置 (可选)
- callback: 写入回调
代码示例
fs.appendFile("./座右铭.txt", "择其善者而从之,其不善者而改之。", (err) => {
if (err) throw err;
console.log("追加成功");
});
4、同步追加写入appendFileSync
语法
fs.appendFileSync(file, data[, options])
参数说明:
与 fs.appendFile
大体一致,只是没有 callback
参数
代码示例
fs.appendFileSync("./座右铭.txt", "\r\n温故而知新, 可以为师矣");
5、流式写入createWriteStream
语法
fs.createWriteStream(path[, options])
参数说明:
- path: 文件路径
- options: 选项配置( 可选 )
代码示例
let ws = fs.createWriteStream("./观书有感.txt");
ws.write("半亩方塘一鉴开\r\n");
ws.write("天光云影共徘徊\r\n");
ws.write("问渠那得清如许\r\n");
ws.write("为有源头活水来\r\n");
ws.end();
二、文件读取
文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
主要场景:
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git 查看日志
- 上传文件
- 查看聊天记录
1、异步读取readFile
语法
fs.readFile(path[, options], callback)
参数说明:
- path: 文件路径
- options: 选项配置
- callback: 回调函数
代码示例
fs.readFile("./座右铭.txt", (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFile("./座右铭.txt", "utf-8", (err, data) => {
if (err) throw err;
console.log(data);
});
2、同步读取readFileSync
语法
fs.readFileSync(path[, options])
返回值: string | Buffer
参数说明:
- path: 文件路径
- options: 选项配置( 可选 )
代码示例
//导入 fs 模块
let data = fs.readFileSync("./座右铭.txt");
console.log(data);
let data2 = fs.readFileSync("./座右铭.txt", "utf-8");
console.log(data2);
3、流式读取createReadStream
语法
fs.createReadStream(path[, options])
参数说明:
- path: 文件路径
- options: 选项配置( 可选 )
代码示例
//创建读取流对象
let rs = fs.createReadStream("./观书有感.txt");
//每次取出 64k 数据后执行一次 data 回调
rs.on("data", (data) => {
console.log(data);
console.log(data.length);
});
//读取完毕后, 执行 end 回调
rs.on("end", () => {
console.log("读取完成");
});
三、文件的移动和重命名
在 Node.js 中,我们可以使用 rename
或 renameSync
来移动或重命名 文件或文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
- oldPath: 文件当前的路径
- newPath: 文件新的路径
- callback: 操作后的回调
代码示例:
fs.rename("./观书有感.txt", "./论语/观书有感.txt", (err) => {
if (err) throw err;
console.log("移动完成");
});
fs.renameSync("./座右铭.txt", "./论语/我的座右铭.txt");
四、删除文件
在 Node.js 中,我们可以使用 unlink
或 unlinkSync
来删除文件
语法:
- 异步删除:
fs.unlink(path, callback)
- 同步删除:
fs.unlinkSync(path)
参数说明:
- path: 文件路径
- callback: 操作后的回调
代码示例:
fs.unlink("./test.txt", (err) => {
if (err) throw err;
console.log("删除成功");
});
fs.unlinkSync("./test2.txt");
五、文件夹操作
借助 Node.js 的能力,我们可以对文件夹进行 创建 、 读取 、 删除 等操作
方法 | 说明 | |
---|---|---|
mkdir / mkdirSync | 创建文件夹 | |
readdir / readdirSync | 读取文件夹 | |
rmdir / rmdirSync | 删除文件夹 |
1、创建文件夹mkdir
在 Node.js 中,我们可以使用 mkdir
或 mkdirSync
来创建文件夹 语法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
参数说明:
- path: 文件夹路径
- options: 选项配置( 可选 )
- callback: 操作后的回调
代码示例:
//异步创建文件夹
fs.mkdir("./page", (err) => {
if (err) throw err;
console.log("创建成功");
});
//递归异步创建
fs.mkdir("./1/2/3", { recursive: true }, (err) => {
if (err) throw err;
console.log("递归创建成功");
});
//递归同步创建文件夹
fs.mkdirSync("./x/y/z", { recursive: true });
2、读取文件夹readdir
在 Node.js 中,我们可以使用 readdir
或 readdirSync
来读取文件夹 语法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
参数说明:
- path: 文件夹路径
- options: 选项配置( 可选 )
- callback: 操作后的回调
代码示例:
//异步读取
fs.readdir("./论语", (err, data) => {
if (err) throw err;
console.log(data);
});
//同步读取
let data = fs.readdirSync("./论语");
console.log(data);
3、删除文件夹rmdir
在 Node.js 中,我们可以使用 rmdir
或 rmdirSync
来删除文件夹
语法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
参数说明:
- path: 文件夹路径
- options: 选项配置( 可选 )
- callback: 操作后的回调
代码示例:
//异步删除文件夹
fs.rmdir("./page", (err) => {
if (err) throw err;
console.log("删除成功");
});
//异步递归删除文件夹
fs.rmdir("./1", { recursive: true }, (err) => {
if (err) {
console.log(err);
}
console.log("递归删除");
});
//同步递归删除文件夹
fs.rmdirSync("./x", { recursive: true });
六、查看资源状态
在 Node.js 中,我们可以使用 stat
或 statSync
来查看资源的详细信息
语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
参数说明:
- path: 文件夹路径
- options: 选项配置( 可选 )
- callback: 操作后的回调
示例代码:
//异步获取状态
fs.stat("./data.txt", (err, data) => {
if (err) throw err;
console.log(data);
});
//同步获取状态
let data = fs.statSync("./data.txt");
输出结果:
Stats {
dev: 4232587435,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 7881299347904436,
size: 78,
blocks: 0,
atimeMs: 1737643518462.0686,
mtimeMs: 1737635661132.1885,
ctimeMs: 1737635661132.1885,
birthtimeMs: 1737635215406.0115,
atime: 2025-01-23T14:45:18.462Z,
mtime: 2025-01-23T12:34:21.132Z,
ctime: 2025-01-23T12:34:21.132Z,
birthtime: 2025-01-23T12:26:55.406Z
}
七、相对路径问题
fs 模块对资源进行操作时,路径的写法有两种:
相对路径
./座右铭.txt
当前目录下的座右铭.txt座右铭.txt
等效于上面的写法../座右铭.txt
当前目录的上一级目录中的座右铭.txt
绝对路径
D:/Program Files windows
系统下的绝对路径/usr/bin Linux
系统下的绝对路径
相对路径中所谓的 当前目录 ,指的是 命令行的工作目录 ,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG
更新日志
e7112
-1于