前端---【Node.JS的fs(文件系统)操作模块】
目录
2.2.3 appendFile / appendFileSync 追加写入
一. nodeJS fs模块介绍
概念解释:fs 全称为 `file system`,称之为`文件系统`,是 Node.js 中的`内置模块`,可以对计算机中的磁盘进行操作。
本章节会介绍如下几个操作:
- 1. 文件写入
- 2. 文件读取
- 3. 文件移动与重命名
- 4. 文件删除
- 5. 文件夹操作
- 6. 查看资源状态
二. fs文件系统的操作
2.1 文件写入
文件写入就是将`数据`保存到`文件`中,我们可以使用如下几个方法来实现该效果
2.2文件写入方法
- writeFile 异步写入
- writeFileSync 同步写入
- appendFile / appendFileSync 追加写入
- createWriteStream 流式写入
2.2.1 writeFile 异步写入
语法: fs.writeFile(file, data[, options], callback)
参数说明:
- file 文件名
- data 待写入的数据
- options 选项设置可选
- callback 写入回调
代码示例:
//1. 导入 fs 模块 require 需要
let fs = require('fs');
//2.1 调用方法写入文件 write 写 File 文件, 如果目标文件不存在, 会自动创建
// fs.writeFile('文件路径','写入的内容', '回调函数'); error 该回调函数会在写入完成后, 自动执行
fs.writeFile('/代码/iindex.html', '理性的人追求的并非快乐,而只是避免痛苦', err => {
//判断
if (err) {
console.log('写入失败~~');
} else {
console.log('写入成功~~');
}
});
第二种方式写入方式:绝对路径写入
//2.2 绝对路径
fs.writeFile('index2.html',
'我如清心照明月,明月负我如梭哈', err => {
//如果存在错误
if (err) {
console.log('写入失败');
return;
}
console.log('写入成功');
})
执行结果 由此看到 我们在文件写入的名字,就是生成新文件的名字.写入的结果在新文件里
新文件写入结果
2.2.2 writeFileSync 同步写入
语法: fs.writeFileSync(file, data[, options])
代码
fs.writeFileSync('./index.html', '<h1>看看人间的苦难,听听人民的呐喊</h1>');
Node.js 中的磁盘操作是由其他`线程`完成的,结果的处理有两种模式:
- 同步处理 JavaScript 主线程`会等待`其他线程的执行结果,然后再继续执行主线程的代码,效率较低
- 异步处理 JavaScript 主线程`不会等待`其他线程的执行结果,直接执行后续的主线程代码,效率较好
2.2.3 appendFile / appendFileSync 追加写入
appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同.
语法:
- fs.appendFile(file, data[, options], callback)
- fs.appendFileSync(file, data[, options])
代码
// //1. 导入 fs 模块 require 需要
let fs = require('fs');
// 2.5 追加写入 appendFileSync
fs.appendFile('./index.html', '没有值不值得,只有愿不愿意\r\n', err => {
if (err) throw err;
console.log('写入成功');
});
运行截图
2.2.4 createWriteStream 流式写入
作用:程序打开一个文件是需要消耗资源的`,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于`大文件写入或者频繁写入`的场景, writeFile 适合于`写入频率较低的场景
语法:fs.createWriteStream(path[, options])
代码
//1. 导入 fs 模块
const fs = require('fs');
//2. 创建写入流对象 create 创建 write 写入 stream 流
const ws = fs.createWriteStream('./index.html');
//3. 调用对象的 write 方法完成写入
ws.write(' 你很好\r\n');
ws.write('漂亮\r\n');
ws.write('大方\r\n');
ws.write('热情\r\n');
ws.write('自立\r\n');
运行截图
2.2.5 写入文件的场景
当需要持久化保存数据`的时候,应该想到`文件写入,文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入,
- 下载文件
- 安装软件
- 保存程序日志,如 Git
- 编辑器保存文件
- 视频录制
2.3 文件读取
文件读取顾名思义,就是通过程序从文件中取出其中的数据,
我们可以使用如下几种方式:
- readFile 异步读取
- readFileSync 同步读取
- createReadStream 流式读取
2.3.1异步读取
read读file文件,语法:fs.readFile(path[, options], callback)
代码示范 这里读取是上文的index.html文件
//1. 导入 fs 模块
const fs = require('fs');
//调用方法 read 读 file 文件
//fs.readFile('文件路径', '回调函数'); // 回调函数会在文件读取完成后`自动执行`
fs.readFile('./index.html', (err, data) => {
//判断
if (err) throw err;
//输出文件的内容
console.log(data.toString());
});
运行截图
2.3.2 同步读取
语法:fs.readFileSync(path[, options])
代码示范
//1. 导入 fs 模块
const fs = require('fs');
//2同步读取
let data = fs.readFileSync('./index.html');
console.log(data.toString());
运行截图
2.3.3 流式读取
//读取 index.html 文件内容
//1. 导入
const fs = require('fs');
//2. 创建读取流对象
// const rs = fs.createReadStream('./index.html');
const rs = fs.createReadStream('../资料/笑看风云.mp4');
//3. 绑定事件 chunk 块儿 大块儿
rs.on('data', chunk => { // 取出一块儿数据之后, 会自动执行该回调函数
// console.log(chunk);
//输出取出 buffer 长度
console.log(chunk.length);//65536 字节 => 64KB
});
//读取完成事件
rs.on('end', () => {
console.log('读取完成');
});
2.3.4 读取文件应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git 查看日志
- 上传文件
- 查看聊天记录
2.4 文件重命名与移动
在 Node.js 中,我们可以使用 rename或 renameSync来移动或重命名`文件或文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
* oldPath 文件当前的路径
* newPath 文件新的路径
* callback 操作后的回调
2.4.1文件重命名
代码示例:
//1. 导入 fs 模块
const fs = require('fs');
//2. 调用方法重命名 会在重命名结束之后,自动执行
//fs.rename('目标文件的路径', '重命名之后的路径', err => {});
fs.rename('./index.html', './观书有感.html', err => {
if (err) throw err;
console.log('操作成功');
})
未命名的图片 文件名称index.html
执行后的代码
2.4.2 文件移动
代码示列
//1. 导入 fs 模块
const fs = require('fs');
//2 移动文件
fs.rename('./观书有感.html', './project/观书有感.html', err => {
if (err) throw err;
console.log('移动成功');
});
2.5文件删除
//导入 fs 模块
const fs = require('fs');
//调用方法删除
fs.unlink('./project/观书有感.html', err => {
if (err) throw err;
console.log('删除成功~~');
});
2.6文件夹操作
2.6.1创建一个新的文件夹
fs.mkdir(path [, options], callback)
const fs = require('fs');
// 创建一个新的文件夹
fs.mkdir('./test', (err) => {
if (err) throw err;
console.log('文件夹创建成功');
});
2.6.2读取文件夹
-
fs.readdir(path [, options], callback)
:读取一个文件夹中的所有文件和子文件夹。 -
path
:要读取的文件夹的路径。 -
options
:一个可选的对象,用于指定读取文件夹的编码和排序方式等。 -
callback
:一个回调函数,用于在读取完成后执行。const fs = require('fs'); // 读取一个文件夹中的所有文件和子文件夹 fs.readdir('./test', (err, files) => { if (err) throw err; console.log('文件夹中的文件和子文件夹:', files); });
2.6.3 删除文件夹
2.6.3.1删除空文件夹
fs.rmdir(path [, options], callback)
:删除一个空的文件夹。
path
:要删除的文件夹的路径。options
:一个可选的对象,用于指定递归选项等。callback
:一个回调函数,用于在删除完成后执行。const fs = require('fs'); // 删除一个空的文件夹 fs.rmdir('./test', (err) => { if (err) throw err; console.log('文件夹删除成功'); });
2.6.3.2 删除一个文件夹
fs.rm(path [, options], callback)
:删除一个文件夹或者文件。
path
:要删除的文件夹或者文件的路径。options
:一个可选的对象,用于指定递归选项等。callback
:一个回调函数,用于在删除完成后执行。const fs = require('fs'); // 删除一个文件夹或者文件 fs.rm('./test', { recursive: true }, (err) => { if (err) throw err; console.log('文件夹或者文件删除成功'); });
三. 路径
fs 模块对资源进行操作时,路径有多种写法
3.1相对路径
相对路径中所谓的`当前目录`,指的是`命令行的工作目录`,而并非是文件的所在目录
./座右铭.txt 当前目录下的座右铭.txt
座右铭.txt 等效于上面的写法
../座右铭.txt 当前目录的上一级目录中的座右铭.txt
相对路径代码举例
const fs = require('fs');
const path = require('path');
// 获取当前文件所在的目录
const currentDir = path.dirname(__filename);
// 读取同一目录下的 index.html 文件
fs.readFile(path.join(currentDir, 'index.html'), 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
3.2绝对路径
是从文件系统的根目录开始指定文件或目录的路径
D:/Program Files windows 系统下的绝对路径
/usr/bin Linux 系统下的绝对路径
绝对路径代码举例:
const fs = require('fs');
// 读取 /var/www/html/index.html 文件
fs.readFile('/var/www/html/index.html', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
3.3 __dirname
__dirname与 require 类似,都是 Node.js 环境中的'全局'变量
__dirname 保存着当前文件所在目录的绝对路径,可以使用 __dirname 与文件名拼接成绝对路径
代码示例:
let data = fs.readFileSync(__dirname + '/data.txt');
console.log(data);
dirname说明 使用fs模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的 Bug.