目录
Node.js 的 fs模块(fs API)
fs: file system 文件系统
fs模块可以实现与硬盘的交互。例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作。
1.写入文件
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile /appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
//文件名:nodejs-fs/code/1-文件写入.js
/** 文件写入需求:
* 新建一个文件,座右铭.txt,写入内容:三人行,则必有我师焉。
*/
// 1.导入fs模块
const fs = require('fs'); //require 是 Node.js 环境中的全局函数,用于导入模块
//2.写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉。', err => {
//写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
1.1 writeFile 异步写入
语法: fs.writeFile(file, data[, options], callback)
参数说明:
- file 文件名
- data 待写入的数据
- option 选项设置(可选)
- callback 写入回调
返回值: undefined
1.2 writeFileSync 同步写入
1.3 appendFile /appendFileSync 追加写入
//文件名:nodejs-fs/code/2-追加写入.js
const fs = require('fs'); //导入fs模块
//3.追加写入
fs.appendFile('./座右铭.txt','择其善者而从之,择其不善者而改之', err => {
if(err){
console.log('写入失败');
return;
}
console.log('追加写入成功');
});
fs.appendFileSync('./座右铭.txt','\r\n 温故而知新,可以为师矣。');
// writeFile 实现追加写入
fs.writeFile('./座右铭.txt','one two',{
flag: 'a'}, err => {
//写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
1.4 createWriteStream 流式写入
语法: fs.createWriteStream (path[, options])
参数说明:
- path 文件路径
- option 选项设置(可选)
返回值: Object
//文件名:nodejs-fs/code/3-流式写入.js
const fs = require('fs'); //导入fs模块
//4. createWriteStream 流式写入
const ws = fs.createWriteStream('./观书有感.txt');
//write
ws.write('一去二三里\r\n');
ws.write('烟村四五家\r\n');
ws.write('亭台六七座\r\n');
ws.write('八九十之花\r\n');
//关闭通道
ws.close(); //可不加这一句
1.5文件写入应用场景
当需要持久化保存数据的时候,应该想到文件写入
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入:
- 下载文件
- 安装软件
- 保存程序日志,如Git
- 编辑器保存文件
2.文件读取
文件读取:就是通过程序从文件中取出其中的数据,可用如下几种方式:
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
2.1 readFile 异步读取
语法: fs.readFile (path[, options],callback)
参数说明:
- path 文件路径
- option 选项设置(可选)
- callback 回调函数
返回值:undefined
//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs'); //导入fs模块
//2.1 readFile 异步读取
fs.readFile('./观书有感.txt', (err,data) => {
if(err) throw err;
console.log(data);
console.log(data.toString());
});
2.2 readFileSync 同步读取
//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs'); //导入fs模块
//2.2 readFileSync 同步读取
let data = fs.readFileSync('./观书有感.txt');
console.log(data);
console.log(data.toString());
2.3 createReadStream 流式读取
//文件名:nodejs-fs/code/5-流式读取.js
const fs = require('fs'); //导入fs模块
//2.3 createReadStream 流式读取
//创建读取流对象
const rs = fs.createReadStream('爱你.mp4');
//绑定 data 事件; chunk 块儿
rs.on('data',chunk => {
console.log(chunk);
console.log(chunk.length); //65536 字节 => 64 KB
})
// end 事件 可选
rs.on('end',() => {
console.log('读取完成');
})
2.4 文件读取应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看照片
- 播放视频
- 播放音乐
- Git查看日志
- 上传文件
- 查看聊天记录
3.文件复制、重命名与移动
文件复制:
//文件名:nodejs-fs/code/6-文件复制.js
/** 文件复制需求:
* 复制 【爱你.mp4】
*/
const fs = require('fs'); //导入fs模块
//process是Node.js内置模块;memoryUsage是process的一个方法,获取内存占用量
const process = require('process');
//方式一 readFile
let data = fs.readFileSync('./爱你.mp4'); //读取文件内容
fs.writeFileSync('./资料/爱你.mp4', data); //写入文件
console.log(process.memoryUsage()); //rss:50020352 字节
/**
{
rss: 50020352,
heapTotal: 6438912,
heapUsed: 5848504,
external: 20551626,
arrayBuffers: 20120219
}
*/
//方式二 流式操作 【该方式更好,所占资源少】
const rs = fs.createReadStream('./爱你.mp4'); //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你1.mp4'); //创建写入流对象
//绑定 data 事件
rs.on('data',chunk => {
ws.write(chunk);
});
rs.on('end',() => {
console.log(process.memoryUsage()); //rss: 43552768 字节
});
//方式三 流式操作 【该方式用的不多】
const rs = fs.createReadStream('./爱你.mp4'); //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你2.mp4'); //创建写入流对象
rs.pipe(ws);
文件重命名与移动:
//文件名:nodejs-fs/code/7-文件重命名与移动.js
/** 文件重命名需求:
* 座右铭.txt 重命名为 论语.txt
*/
const fs = require('fs'); //导入fs模块
//调用 rename 方法 进行文件重命名
fs.rename('./座右铭.txt','./论语.txt', err => {
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
//文件的移动
fs.rename('./遇见.mp3','./资料/遇见.mp3', err => {
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
4.文件删除
在Node.js中,可用unlink 、unlinkSync 、rm 、 rmSync 来删除文件
语法:
fs.unlink(path,callback)
fs.unlinkSync(path)
fs.rm(path,callback)
fs.rmSync(path)
参数说明:
- path 文件路径
- callback 回调函数
//文件名:nodejs-fs/code/8-删除文件.js
const fs = require('fs'); //导入fs模块
// 调用 unlink 方法 unlinkSync
fs.unlink('./资料/爱你.mp4', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
fs.unlinkSync('./爱你.mp4');
// 调用 rm 方法 Node.js的14.4版本引入 rmSync
fs.rm('./资料/爱你2.mp4', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
fs.rmSync('./资料/爱你1.mp4');
5.文件夹操作
借助Node.js的能力,可对文件进行创建、读取、删除等操作。
方法 | 说明 | 语法 |
---|---|---|
mkdir | 创建文件夹 | mkdir(path[, options],callback) |
mkdirSync | 创建文件夹 | mkdirSync(path[, options]) |
readdir | 读取文件夹 | readdir(path[, options],callback) |
readdirSync | 读取文件夹 | readdirSync(path[, options]) |
rmdir | 删除文件夹 | rmdir(path[, options],callback) |
rmdirSync | 删除文件夹 | rmdirSync(path[, options]) |
//文件名:nodejs-fs/code/9-文件夹操作.js
const fs = require('fs'); //导入fs模块
//创建文件夹; mk make 制作;dir directory 文件夹
fs.mkdir('./html', err => {
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
//递归创建文件夹
fs.mkdir('./a/b/c',{
recursive: true}, err => {
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
//读取文件夹
fs.readdir('./资料', (err,data) => {
if(err){
console.log('读取失败');
return;
}
console.log(data);
}); //结果为 [ '爱你1.mp4', '爱你2.mp4', '遇见.mp3' ]
//删除文件夹 rm remove 移除
fs.rmdir('./html', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
//递归删除文件夹 【不推荐使用】
fs.rmdir('./a',{
recursive: true}, err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
//递归删除文件夹 【推荐使用】
fs.rm('./a',{
recursive: true}, err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
6.查看资源状态
在Node.js中,可用stat 、 statSync来查看资源的详细信息。
语法:
fs.stat (path[, options],callback)
fs.statSync (path[, options])
//文件名:nodejs-fs/code/10-查看资源信息.js
const fs = require('fs'); //导入fs模块
// stat 方法 status 缩写 状态
fs.stat('./资料/爱你1.mp4', (err,data) => {
if(err){
console.log('操作失败');
return;
}
console.log(data);
console.log(data.isFile()); //isFile检测是否为文件
console.log(data.isDirectory()); //isDirectory检测是否为文件夹
});
/*结果如下:
Stats {
dev: 177919585,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 1125899907180791,
size: 20102613, //文件大小
blocks: 39264,
atimeMs: 1685517209138.5369,
mtimeMs: 1685517209138.5369,
ctimeMs: 1685517209138.5369,
birthtimeMs: 1685516572800.8633,
atime: 2023-05-31T07:13:29.139Z,
mtime: 2023-05-31T07:13:29.139Z, //最后修改时间
ctime: 2023-05-31T07:13:29.139Z,
birthtime: 2023-05-31T07:02:52.801Z //创建时间
}
true
false
*/
7.相对路径问题
fs模块对资源进行操作时,路径的写法有两种:
相对路径:
- . /座右铭.txt :当前目录下的座右铭.txt
- 座右铭.txt :等效于上面的写法
- . . /座右铭.txt :当前目录的上一级目录中的座右铭.txt
绝对路径:
- D:/Program Files :windows系统下的绝对路径
- /usr/bin :linux系统下的绝对路径
相对路径中所谓的当前目录 ,指的是命令行的工作目录,而并非是文件的所在目录;
所以当命令行的工作目录与文件所在目录不一致时,会出现一些BUG.
8._ _dirame【相对路径的Bug与解决】
//文件名:nodejs-fs/code/12-相对路径的BUG.js
const fs = require('fs');
//相对路径参照物:命令行的工作目录
fs.writeFileSync('./index.html','love');
//绝对路径 ‘全局变量’保存的是:所在文件的所在目录的绝对路径
console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html','love');
9.练习:批量重命名
//文件名:nodejs-fs/1-重命名.js
const fs = require('fs');
//读取 code 文件夹
const files = fs.readdirSync('./code');
console.log(files);
//遍历数组
files.forEach(item => {
// 拆分文件名
let data = item.split('-');
let [num, name] = data;
//判断
if(Number(num) < 10){
num = '0' + num;
}
//创建新的文件名
let newName = num + '-' + name;
//重命名
fs.renameSync(`./code/${
item}`, `./code/${
newName}`);
});