Node.js -- fs模块

文章目录

    1. 写入文件
    • 1.1 写入文件
    • 1.2 同步和异步
    • 1.3 文件追加写入
    • 1.4 流式写入
    • 1.5 文件写入的场景
    1. 读取文件
    • 2.1 异步和同步读取
    • 2.2 读取文件应用场景
    • 2.3 流式读取
    • 2.4 fs 练习 -- 文件复制
    1. 文件重命名和移动
    1. 文件删除
    1. 文件夹操作
    • 5.1 创建文件夹
    • 5.2 读取文件夹
    • 5.3 删除文件夹
    1. 查看资源状态
    1. 资源路径
    • 7.1 路径使用
    • 7.2 相对路径的bug
    • 7.3 fs 练习 -- 批量重命名

fs -- file system

fs模块可以实现与硬盘的交互

例如文件的创建、删除、重命名、移动,

还有文件内容的写入、读取,以及文件夹的相关操作

1. 写入文件

1.1 写入文件

  1. 导入fs 模块
javascript 复制代码
const fs = require('fs');
  1. 写入文件
javascript 复制代码
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err =>
// err写入失败:错误对象 写入成功:nul1
if(err){
console.1og('写入失败');
return;
console.1og('写入成功');
}
);
console.log(1+1);

// 2

// 写入成功

其实,我们平常文件的保存也是使用了node 的fs 模块!

1.2 同步和异步

  1. 异步执行

    上面我们在学习写入模块时举出的案例就时是异步编程,程序会先输出2 的原因是js 文件从上之下执行,写入文件时时异步执行,就像但与我们之前学过的setTimeOut 定时器。

  2. 同步执行

javascript 复制代码
fs.writeFileSync('./data.txt','test');
// 这种方法没有回调函数

此时程序没有其他线程,只能等这步代码执行完之后再进行下面的程序。

1.3 文件追加写入

javascript 复制代码
// 第一种方法
fs.appendFile('./座右铭.txt','择其善者而从之,择期不善者而改之',err=>{
//判断
if(err){
console.log('写入失败');
return;
}
console.log('追加写入成功');
});
// 第二种方法
fs.appendFileSync('./座右铭.txt','择其善者而从之,择期不善者而改之')
// 第三种方法
fs.appendFile('./座右铭.txt','love love love',{flag: 'a'},err=>{
//判断
if(err){
console.log('写入失败');
return;
}
console.log('\r\n追加写入成功'); // \r\n 表示换行
});
// 这种方法我们一般在日志使用

1.4 流式写入

javascript 复制代码
// 1.导人fs
const fs = require('fs');
// 2.创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt');
// 3.write
ws.write('半亩方塘一鉴开r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('间渠那得清如许r\n');
ws.write('为有源头活水来\r\n');
// 4.关闭通道
ws.close();

之前讲过的写入文件方式都是调用一次方法写入一次,会消耗资源,而这种方法的优势就是在没有关闭通道的时候,可以一直向文件中写入内容。

1.5 文件写入的场景

文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入

  • 下载文件
  • 安装软件
  • 保存程序日志,如Git
  • 编辑器保存文件
  • 视频录制

当需要持久化保存数据的时候,应该想到文件写入

2. 读取文件

2.1 异步和同步读取

语法:fs.readFile(path[,options],callback)

参数说明:

  • path文件路径
  • options选项配置
  • callback回调函数
    返回值:undefined
javascript 复制代码
// 1.引入fs模块
const fs = require('fs');

// 2.异步读取
fs.readFile('./观书有感.txt',(err,
data) => {
if(err){
console.log('读取失败~');
return;
}
console.log(data.toString());
)
})

// 3.同步读取
let data = fs.readFileSync('./观书有感.txt');
console.log(data.toString());

2.2 读取文件应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git 查看日志
  • 上传文件
  • 查看聊天记录

2.3 流式读取

流式读取就是相当于把文件分成了若干块儿,一次读取若干块儿内容。

javascript 复制代码
// 1.引入fs模块
const fs = require('fs');
// 2.创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');
// 3.绑定data事件
// chunk --> 块儿 大块儿
rs.on('data',chunk => {
console.log(chunk)
console.log(chunk.length);// 65536字节 = 64KB
// console.log(chunk.toString()); // 视频信号不是以字符串的形式存储的,这样强制使用UTF-8 形式输出的内容会乱码
});
//
console.log(chunk.toString());// 65536 = 64KB
):
// 4.end可选事件
rs.on('end',()=>{
console.1og('读取完成');
}

2.4 fs 练习 -- 文件复制

javascript 复制代码
// 方式一 readFile
const fs = require('fs');
// 读取文件内容
// let data = fs.readFileSync('../资料/笑看风云.mp4');
// 写入文件
// fs.writeFileSync('../资料/笑看风云-2.mp4',data);
console.log(process.memoryUsage());// rss => 整个文件大小 => 110718784字节 => 105MB
// process.memoryUsage() 获取文件内存

// 方式二 流式操作
// 创建读取流对象
const rs = fs.createReadStream('./资料/笑看风云.mp4');
// 创建写入流对象
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');
// 绑定data事件
rs.on('data',chunk => {ws.write(chunk);
});
rs.on('end',()=>
console.log(process.memoryUsage());//43106304 => 41MB
})
rs.pipe(ws) // 了解即可 也是一种文件写入流

3. 文件重命名和移动

javascript 复制代码
// 文件重命名
// 1.导入fs模块
const fs = require('fs');
// 2.调用rename方法
fs.rename('./座右铭.txt','./论语.txt',err=>{if(err){
console.log('操作失败~');
return;
}
console.log('操作成功');
});

// 文件移动
fs.rename('./data.txt','../资料/data.txt',err => {
if(err){
console.log('操作失败~');
return;
}
console.log('操作成功');
});

4. 文件删除

javascript 复制代码
// 1.导入fs模块
const fs require('fs');
// 2.调用un1ink方法 对应同步操作=>unlinkSync
fs.unlink('./观书有感.txt',err=>{
if(err){
console.1og('删除失败~');
return;
}
console.log('删除成功');
});

// 1.导入fs模块
const fs require('fs');
// 2.调用rm方法 对应同步操作=>rmSync
fs.rm('./观书有感.txt',err=>{
if(err)
console.1og('删除失败~');
return;
console.log('删除成功);
});

5. 文件夹操作

5.1 创建文件夹

javascript 复制代码
// 1.导入fs模块
const fs require('fs');

//第一种方法
// 2.创建文件夹mk make制作dir directory文件夹
fs.mkdir('./html',err =>
if(err){
console.1og('创建失败~');
return;
}
console.1og('创建成功');
})

// 第二种方法 递归创建
fs.mkdir('./a/b/c',{recursive: true},err =
if(err){
console.1og('创建失败~');
return;
}
console.1og('创建成功');
})

5.2 读取文件夹

javascript 复制代码
//2-3读取文件夹
// read 读取 dir directory 文件夹
fs.readdir('./资料',(err,data)=>{
if(err){
console.1og('读取失败');
return;
}
console.log(data);
})

fs.readdir('./',(err,data) => {
if(err){
console.1og('读取失败');
return
}
console.log(data);
})

5.3 删除文件夹

javascript 复制代码
// rm => remove 
fs.rmdir('./html',err =
if(err){
console.1og('删除失败');
return;
console.log('删除成功');
});

// 递归删除
// 文件夹不为空时无法删除
// 不建议使用
fs.rmdir('./a',{recursive:true},err =
if(err){
console.log(err);
return;
console.1og('删除成功');
});

//建议使用
fs.rm('./a',{recursive:true},err =
if(err){
console.log(err);
return;
console.1og('删除成功);
})

6. 查看资源状态

javascript 复制代码
// 1.导入fs模块
const fs require('fs');
// 2.stat方法status缩写状态
fs.stat('./资料/笑看风云.mp4',(err,data)
=>{
if(err){
console.1og('操作失败');
return;
}
console.log(data);
// data.file() => 查看是否为文件
// data.isDirectory() => 查看是否为文件夹
})

7. 资源路径

7.1 路径使用

javascript 复制代码
// 1.导入fs模块
const fs require('fs');

// 相对路径
// 当前文件夹
fs.writeFileSync('./index.html','love');
// fs.writeFileSync('index.html','love');
// 上一级文件夹
fs.writeFileSync('../index.html','love');

//绝对路径
fs.writeFilesync('D:/index.html','love');
// fs.writeFileSync('C:/index.html','love'); 报错 权限不允许

7.2 相对路径的bug

现有文件夹目录如下:

执行以下代码:

javascript 复制代码
const fs = require('fs');
fs.writeFileSync('./index.html','love');

为什么index.html 创建在了代码的同级目录下呢?这是因为相对路径的参照物是命令行的工作目录

要解决这个问题就要转换为绝对路径:

我们每次去写绝对变量都需要写好长一段,但是使用__dirname(可以理解为全局变量,保存的是所在文件的所在目录的绝对路径)

javascript 复制代码
console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html','love');

7.3 fs 练习 -- 批量重命名

javascript 复制代码
const fs = require('fs');
const files fs.readdirSync('./code');
// 遍历数组
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}`);
})

思考:

如果将02 文件删除,那么怎么将文件名称03变02,以此类推将下面所有的文件名称修改,接着排序。

答案在资料中。

相关推荐
囚生CY7 分钟前
【学习笔记】Langchain基础(二)
笔记·学习·langchain
Jay_51535 分钟前
C语言环形数组(循环队列)详解:原理、实现与应用
c语言·学习·嵌入式·环形数组
Jay Kay36 分钟前
TensorFlow Serving学习笔记2: 模型服务
学习·tensorflow
小小小小宇42 分钟前
前端 Service Worker
前端
只喜欢赚钱的棉花没有糖1 小时前
http的缓存问题
前端·javascript·http
梦境虽美,却不长1 小时前
数据结构 学习 队列 2025年6月14日 11点22分
数据结构·学习·队列
小小小小宇2 小时前
请求竞态问题统一封装
前端
loriloy2 小时前
前端资源帖
前端
源码超级联盟2 小时前
display的block和inline-block有什么区别
前端
GISer_Jing2 小时前
前端构建工具(Webpack\Vite\esbuild\Rspack)拆包能力深度解析
前端·webpack·node.js