**
> fs模块可以实现与硬盘的交互、例如文件的船舰、删除、重命名、移动、还有文件内容的写入、读取,以及文件夹的相关操作;
**
1、写入文件
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile/appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
1-1、writeFile异步写入
语法:fs.writeFile(file,data,[,options],callback)
参数说明:
- file文件名
- data待写入的数据
- options选项设置(可选)
- callback写入回调
返回值:undefined
1-2、writeFileSync同步写入文件
// 需求:
// 新建一个文件,座右铭.txt,写入内容 哈哈哈
// 1、导入fs模块
const fs = require('fs')
// 2、异步写入文件
fs.writeFile('./座右铭','哈哈哈',(err)=>{
//err写入失败,错误对象 写入成功:null
if(err){
console.log('写入失败')
reuturn
}
console.log('写入成功')
})
// 同步写入文件
fs.writeFileSync('./data.txt','test');
1-3、appendFile/appendFileSync追加写入
appendFile作用是在文件尾部追加写入内容,appendFile和writeFile语法完全相同,二者返回值都是undefined
// 异步追加
const fs = require("fs");
fs.appendFile("./座右铭", "\r\n天将降大任于斯人也",(err)=>{
if(err){
console.log('文件追加错误', err)
return
}
console.log('文件追加成功')
});
//同步追加
fs.appendFileSync('./data.txt','大漠孤烟直')
//writeFile实现追加
fs.writeFile('./座右铭','长河落日圆',{flag:'a'},(err)=>{
//err写入失败,错误对象 写入成功:null
if(err){
console.log('写入失败')
reuturn
}
console.log('追加成功')
})
1-4、createWriteStream流式写入
语法:fs.createWriteStream(path,[,options])
参数说明:path文件路径;options选项配置(可选)
(程序打开一个文件是需要消耗CPU资源的,流式写入可以减少打开关闭文件的次数,流式写入的方式适合用于大文件或者频繁写入的场景,writeFile适合于写入频率较低的场景)
// 导入fs
const fs = require('fs')
// 创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt')
// 写入
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(lpath[,options],callback)
参数说明:
- path 文件路径
- options选项配置
- callback回调函数
返回值:undefined
// 引入fs模块
const fs = require('fs')
// 异步读取
fs.readFile('./观书有感.txt',(err,data)=>{
if(err){
console.log('读取失败',err)
return
}
console.log(data.toString())
})
// 同步读取
let data = fs.readFileSync('./观书有感.txt')
console.log(data.toString())
文件读取应用场景:电脑开机、程序运行、编辑器打开文件、查看图片、播放视频、播放音乐等
2-2、createReadStream流式读取
// 引入fs模块
const fs = require("fs");
// 创建读取流对象
const rs = fs.createReadStream("../笑看风云.mp4");
// 绑定data事件 chunk 块
rs.on("data", (chunk) => {
console.log(chunk); //一次读取 65536 字节 =>64kb
});
// end可选事件
rs.on("end", () => {
console.log(读取完成)
});
3、文件移动与重命名
在node中,我们可以使用rename或renameSync来移动或重命名文件或文件夹;
语法:
fs.rename(oldPath,newPath,callback)
fs.renameSync(oldPath,newPath)
参数说明:
- oldPath当前文件的路径
- newPath文件的新路径
- callback操作后的回调
const fs = require('fs')
fs.rename('./座右铭','./哈哈哈.txt',err=>{
if(err){
console.log(err)
return
}
console.log('成功')
})
4、文件删除
在node.js中我们可以使用unlink或unlink来删除文件
语法:
fs.unlink(path,callback)
fs.unlinkSync(path)
参数说明:
- path 文件路径
- callback 操作后的回调
const fs = require('fs')
// 异步删除
fs.unlink('./test2.mp4',(err)=>{
if(err){
console.log(err)
return
}
console.log('删除成功')
})
// 同步删除
fs.unlinkSync('./test2.mp4')
// Node14引入 rm方法
fs.rm('./test2.mp4',(err)=>{
if(err){
console.log(err)
}
console.log('删除成功')
})
// 同步删除
fs.rmSync('./test2.mp4')
5、文件夹操作
借助Node.js的能力,看我们可以对文件夹进行创建、读取、删除等操作
方法 | 说明 |
---|---|
mkdir/mkdirSync | 创建文件夹 |
readdir/readdirSync | 读取文件夹 |
rmdir/rmdirSync | 删除文件夹 |
5-1、在node中我们可以mkdir/mkdirSync来创建文件夹
fs.mkdir(path[,options],callback)
fs.mkdirSync(path,[,options])
参数说明:
- path文件夹路径
- options 选项配置
- callback 操作后的回调
const fs = require("fs");
// 创建文件夹
fs.mkdir('./html',(err)=>{
if(err){
console.log(err)
return
}
console.log('创建成功')
})
// 递归创建
fs.mkdir('./a/b/c',{recursive:true},(err)=>{
if(err){
console.log(err)
return
}
console.log('创建成功')
})
// 读取文件夹
fs.readdir('./',(err,data)=>{
if(err){
console.log(err)
return
}
console.log(data)
});
// 删除文件夹
fs.rmdir("./html", (err) => {
if (err) {
console.log(err);
return;
}
console.log("删除成功");
});
//递归删除
fs.rmdir("./a", { recursive: true }, () => {
if (err) {
console.log(err);
return;
}
console.log("删除成功");
});
// 建议使用
fs.rm("./a", { recursive: true }, () => {
if (err) {
console.log(err);
return;
}
console.log("删除成功");
});
6、查看资源状态
在Node.js中,我们可以使用stat或statSync来查看资源的详细信息
语法:
fs.stat(path[,option],callback)
fs.statSync(path,[,options])
参数说明:
- path 文件夹路径
- options 选项配置(可选)
- callback 操作后的回调
结果值对象结构:
- size 文件体积
- birthime 创建时间
- mtime 最后修改的时间
- isFile 检查是否为文件
- isDirectory 检测是否为文件夹
- atime 最后访问时间
- ctime 最后修改文件状态时间
const fs = require('fs')
fs.stat('./test.mp4',(err,data)=>{
if(err){
console.log(err)
return
}
console.log(data)
console.log(data.isFile())//是否为一个文件
console.log(data.isDirectory())//是否为一个文件夹
})
7、相对路径问题
fs模块对资源进行操作时,路径的写法有两种
相对路径
- ./哈哈哈.txt 当前目录下的文件
- 哈哈哈.txt 等效上面写法
- …/哈哈哈.txt 当前目录上一层级中的座右铭
绝对路径
- D://Program File Windows系统下的绝对路径
- /usr/bin Linux系统下的绝对路径
相对路径中所谓的当前目录,指的是命令行的工作目录,而并非是文件所在目录 所以当前命令行的工作目录与文件所在目录不一致时,会出现一些BUG
8、__dirname
__dirname与require类似,都是Node.js环境中的全局变量
__dirname保存着当前文件夹所在目录的绝对路径,可以使用 _dirname与文件名拼接成绝对路径
代码示例:
let data = fs.readFile(__dirname + './data.txt')
使用fs模块的时候,尽量使用__dirname将路径转为绝对路径,这样可以避免相对路径产生的Bug
9、path模块
path模块提供了操作路径的功能,几个常用API
API | 说明 |
---|---|
path.resolve | 拼接规范的绝对路径 |
path.sep | 获取操作系统的路径分隔符 |
path.parse | 解析路径并返回对象 |
path.basename | 获取路径的基础名称 |
path.dirname | 获取路径的目录名 |
path.extname | 获取路径的扩展名 |