文章目录
一、简介
- fs是什么? fs : file system 文件系统
- fs模块可以实现与硬盘的交互,例如:文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作。
二、fs文件写入
1. 写入过程
(1)步骤:
- step1:创建fs对象
- step2:写入文件
(2)两个函数
- require(id)
- 全局函数,可以用来导入模块
- id:module name or path 字符串类型
- fs.writeFile(file,data[,options],callback) 是异步写入
- file:文件名
- data:数据,往文件里写入什么内容
- options:选项配置对象,可选参数
- callback:回调参数,当写入完成之后会自动调用回调函数,当写入失败把错误传递给回调函数参数;当写入成功把null传递给回调参数
(3)示例:新建一个文件,座右铭.txt,写入内容:三人行,则必有我师焉
//1. 导入fs模块
const fs = require('fs');
//2.写入文件
fs.writeFile('座右铭.txt','三人行,则必有我师焉',err => {
//err有值,是个错误对象
if(err){
console.log(err);
console.log('写入失败');
return;
}
console.log('chengg')
});
2. fs异步与同步(两种工作模式)
//异步写入:writeFileSync参数和writeFile参数基本一样,就是没有最后一个回调函数参数,异步写入效率更高
fs.writeFileSync('data.txt','测试');
3. fs追加写入
appendFile() / appendFileSyn() : 参数同上
//1. 引入fs模块
const fs = require('fs');
//2. 调用 appendFile
let str = '则其善者而从之,其不善者而改之';
fs.appendFile('座右铭.txt',str,err => {
if(err){
console.log("错误");
return;
}
console.log('成功');
});
//3. writeFile() 也可以追加写入,通过配置对象{flag:'a'}
let str1 = ',\r\n温故而知新,可以为师矣!';
fs.writeFile('座右铭.txt',str1,{flag:'a'},err => {
if(err){
console.log(err);
return;
}
console.log('成功!');
})
4. fs 流式写入
更适合写入频次较高的场景,也适合大文件的写入。
//1. 导入
const fs = require('fs');
//2. 创建一个写入流对象
//相当于和文件建立了一个通道,什么时候想写入内容,传入内容即可
const ws = fs.createWriteStream('观书有感.txt');
//3. 写内容
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠哪得清如许\r\n');
ws.write('为有源头活水来\r\n');
//4. 关闭通道
ws.close();
【文件写入应用场景】
- 下载文件
- 安装软件
- 保存程序日志,如Git
- 编辑器保存文件
- 视频录制
【总结】当需要持久化保存数据的时候,应该想到文件写入。
三、fs文件读取
1. 读取方法
- 异步读取方法: fs.readFile(path[,options],callback)
- path:路径
- options:选项配置对象,可选参数
- callback:回调函数,两个形参 err:接受错误信息 data:接收读取的文件内容
- 同步读取方法 : fs.readFileSync(path);
- 参数:path
- 返回值是读取到的数据
2. 应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放音乐视频
- Git查看日志
- 上传文件
- 查看聊天记录
3. fs流式读取
//1. 引入fs模块
const fs = require('fs');
//2. 创建读取流
//createReadStream 接受路径参数
const rs = fs.createReadStream('附件.pdf');
//3. 为读取流对象绑定data事件,用于获取读取到的数据
//chunk:块儿 即读取到的数据块
//每读取一次,回调函数就会执行一次
rs.on('data',chunk => {
console.log(chunk);
console.log(chunk.length); // 每次最多读取65536字节 => 64KB
});
//4. end 可选事件,不一定非要绑定
//当读取流读取完所有的内容之后,会触发 end 事件
rs.on('end', () => {
console.log("读取完成!");
})
4. 练习:复制文件
//需求:复制 附件.pdf 文件
//方式一:readFile
const fs = require('fs');
let data = fs.readFileSync('附件.pdf');
//写入文件
fs.writeFileSync('附件副本.pdf',data);
//方式二:流式操作
const rs = fs.createReadStream('附件.pdf');
const ws = fs.createWriteStream('附件2.pdf');
rs.on('data',chunk => {
ws.write(chunk);
})
//方式二可以直接简写
rs.pipe(ws);
四、fs文件重命名与移动
1. 方法
- fs.rename(oldPath,newPath,callback) 异步
- fs.renameSync(oldPath,newPath) 同步
2. 使用
const fs = require('fs');
fs.rename('./座右铭.txt','./论语.txt',err => {
if(err){
console.log(err);
return;
}
console.log("成功");
})
五、文件删除
1. 方法
- fs.unlink(path,callback) 异步删除 --> 同步:fs.unlinkSync(path)
- fs.rm(path,callback) 异步删除 --> 同步:fs.rmSync(path)
2. 示例
//1. 引入fs模块
const fs = require('fs');
2. unlink方法删除
fs.unlink('./附件2.pdf',err => {
if(err){
console.log("删除出错");
return;
}
console.log("成功");
})
//3. rm方法删除 nodejs 14.4引入的新方法
fs.rm('./附件副本.pdf',err => {
if(err){
console.log("删除出错");
return;
}
console.log("成功");
})
六、文件夹操作
1. 方法
- 创建文件夹:mkdir(path[,options],callback)/mkdirSync
- 读取文件夹:readdir(path,callback)/readdirSync
- path文件夹路径
- callback两个参数:err,data。data是文件夹内容的名称数组。
- 删除文件夹:rmdir(path[,options],callback)/rmdirSync/rm
- rmdir递归删除时会发生警告。递归删除推荐使用 rm
2. 代码
//1. 导入fs模块
const fs = require('fs');
//2. 创建文件夹
//-----------1)创建一个单独的文件夹
fs.mkdir('./新文件夹',err=> {
if(err){
console.log("失败!");
return;
}
console.log("创建成功!");
})
//----------2)递归创建
fs.mkdir('./a/b/c',{recursive:true},err=> {
if(err){
console.log("失败!");
return;
}
console.log("创建成功!");
})
//3. 读取文件夹
fs.readdir('../nodejs_code',(err,data) => {
if(err){
console.log("读取错误");
return;
}
console.log(data);
})
//4. 删除文件夹
//递归删除:建议使用rm()
fs.rm('./a',{recursive:true},err => {
if(err){
console.log("错误");
return;
}
console.log("成功");
})
七、查看资源状态
1. 方法
- fs.stat(path[,options],callback);
- fs.statSync
2. 代码
//1. 导入
const fs = require('fs');
//2. 查看资源状态
fs.stat('./观书有感.txt',(err,data) => {
if(err){
console.log("出错");
return;
}
// console.log(data);
//isFile() 查看资源是不是文件类型,返回值是布尔型
console.log(data.isFile());
//isDirectory() 检测目标资源是不是文件夹
console.log(data.isDirectory());
})
八、fs路径
1. 路径的写法有两种
- 相对路径
- 绝对路径
2. fs相对路径的bug
fs模块相对路径参照物:不是js文件的所在目录,而是命令行的工作目录。
fs.writeFileSync('./index.html','love');
// ./ 当前目录指的是命令行的工作目录
3. __dirname
可以理解为全局变量,始终保存所在文件的所在目录的绝对路径。
fs.writeFileSync(__dirname + '/index.html','love');
九、练习
//需求:吧0-9前面加0
//1. 导入fs模块
const fs = require('fs');
//2. 读取文件夹
const files = fs.readdirSync('./');
//3. 遍历数组
files.forEach(item => {
//判断第一位是否小于10
let data = item.split('-');
//解构赋值
let [index,name] = data;
if(Number(index) < 10 && Number(index) != NaN){
name = "0" + index + '-' + name;
fs.renameSync(`./${item}`,`./${name}`);
}
})