fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块, fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,内容的写入读取等以及文件夹相关操作
写入文件
异步写入
// 导入fs模块const fs = require("fs")// 写入文件
// 参数:file:文件名,如果文件不存在会自动创建
// data:待写入的数据,会覆盖内容
// options:选项设置(可选),可以配置编码、写入模式等等
// callback:写入回调
// 返回值是undefinedfs.writeFile("./test.txt","helloword",err => {// 写入完成之后会自动调用回调函数,如果写入失败,err是一个错误对象console.log(err)
})
同步写入
// 写入文件
// 参数:file:文件名,如果文件不存在会自动创建
// data:待写入的数据,会覆盖内容
// options:选项设置(可选)fs.writeFileSync("./test1.txt","helloword")
追加写入
-
异步写入
// 以追加的形式写入 fs.appendFile("./test.txt", "helloword", err => {console.log(err) })
-
同步写入
fs.appendFileSync("./test.txt", "helloword", err => {console.log(err) })
流式写入
程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数,流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景,相当于 程序和文件建立一个通道,打开一次,持续的写入,最终关闭一次
// 导入fs模块const fs = require("fs")// 创建写入流对象
// 参数:文件路径、options选项,返回值是一个对象
let ws = fs.createWriteStream("./text.txt")// 写入的内容
ws.write("aaaa")
ws.write("bbbb")
ws.write("cccc")// 关闭写入流,可选显示调用
ws.end()
文件读取
异步读取
// 导入fs模块const fs = require("fs")// 异步读取
// 参数:文件路径、options选项配置、回调函数
fs.readFile("./text.txt",(err,data)=>{// 读取到文件之后,回调函数会被调用if (err){console.log("读取失败")}else {// 读取到的内容是一个buffer,可以使用toString转换console.log(data.toString())}})
同步读取
let data = fs.readFileSync("./text.txt")console.log(data.toString())
流式读取
// 导入fs模块const fs = require("fs")// 创建读取流对象
let rs = fs.createReadStream("./text.tx")// 给rs绑定data事件,每次读取64k的数据,每次读取一次后触发一次chunk回调
rs.on("data", chunk => {console.log(chunk)
})// 绑定end事件(可选)
// 全部读取完成后,触发end回调
rs.on("end", ()=>{console.log("关闭")
})
文件移动&重命名
使用 rename 或 renameSync 来移动或重命名 文件或文件夹
-
异步操作
// 参数:oldPath 文件当前的路径 、newPath 文件新的路径 、callback 操作后的回调// 重命名 fs.rename("./text.txt","./run.txt", err => {if (err){console.log(err)}else {console.log("成功")}})// 文件移动 fs.rename("./run.txt","../data/run.txt",err =>{console.log(err) })
-
同步操作
// 参数:oldPath 文件当前的路径 、newPath 文件新的路径 fs.renameSync("./run.txt","./text.txt")
文件删除
-
异步删除
fs.unlink("./text.txt",err => {console.log(err) })
-
同步删除
fs.unlinkSync("./text.txt",err => {console.log(err) })
-
rm方法删除,node14.4版本引入的新方法
// 异步 fs.rm("./text.txt",err => {console.log(err) })// 同步 fs.rmSync("./text.txt")
文件夹操作
创建文件夹
-
异步创建
// 只能创建一层目录 // 参数:文件路径、选项配置、回调函数 fs.mkdir("./data", err => {if (err){console.log("失败")}else {console.log("成功")} })
-
递归异步创建
// 递归创建-可以创建多层目录,创建src文件夹在src下创建uti文件夹l在util下创建main文件夹 fs.mkdir("./src/util/main",{recursive:true},err => {console.log(err) })
-
同步创建
fs.mkdirSync("./dat1a")
-
递归同步创建
// 递归创建-可以创建多层目录,创建src文件夹在src下创建uti文件夹l在util下创建main文件夹 fs.mkdirSync("./src/util/main",{recursive:true})
读取文件夹
-
异步读取
fs.readdir("./",(err,data) =>{console.log(err)console.log(data) // 是一个数组,是文件夹下路径下的资源 })
-
同步读取
let data = fs.readdirSync("./") console.log(data)
删除文件夹
-
异步删除
// 只能删除一层目录 fs.rmdir("./data",err =>{console.log(err) })// 递归删除 fs.rmdir("./data/main",{recursive:true},err =>{console.log(err) })
-
同步删除
fs.rmdirSync("./data")// 递归同步删除 fs.rmdirSync("./data",{recursive:true})
资源状态
// 异步
fs.stat("./data",(err,data)=>{console.log(err)console.log(data) // 是一个对象,包含文件创建时间、体积、类型等等各种信息})// 同步
fs.statSync("./data")
__dirname
__dirname 与 require 类似,都是 Node.js 环境中的'全局'变量
__dirname
保存着 当前文件所在目录的绝对路径 ,可以使用__dirname 与文件名拼接成绝对路径
let data = fs.readFileSync(__dirname + '/data.txt');