fs模块是Nodejs内置的模块
FS模块全称: file System 文件系统。
作用是用于操作文件夹以及文件的,使用的时候要引入fs模块(通过require引入)。
操作文件是异步的,因此fs模块为每一个操作提供了两个方法:
同步方法(sync),异步方法(回调函数监听)
创建文件
fs.appendFile(fileName, content, callback)
fileName: 创建的文件名称(合法的路径)
content: 追加的内容
callback:
参数表示错误异常
如果创建成功 则返回null,如果创建失败 则返回一个错误对象
创建文件夹
fs.mkdir(pathName, callback)
pathName: 文件夹名称
callback: 回调函数
参数表示错误异常
如果创建成功 则返回null,如果创建失败 则返回一个错误对象
删除文件:
fs.unlink(fileName, callback)
fileName: 要删除的文件
callback: 回调函数
参数表示错误异常
如果删除成功 则返回null,如果删除失败 则返回一个错误对象
删除文件夹
fs.rmdir(dirName, callback)
注意: 该方法只能删除空文件夹
dirName: 要删除的文件夹名称
callback: 回调函数
参数表示错误异常
如果删除成功 则返回null,如果删除失败 则返回一个错误对象
修改文件(文件名,剪切文件,修改文件夹,剪切文件夹)
fs.rename(oldName, newName, callback)
oldName: 原来的路径
newName: 新的路径
callback: 回调函数
参数表示错误异常
如果修改成功 则返回null,
读取文件
fs.readFile(fileName, callback)
fileName: 要读取的文件名称
callback: 回调函数,有两个参数:
第一个参数:错误异常
如果创建成功 则返回null,
如果创建失败 则返回一个错误对象
第二个参数 读取成功时候的数据
默认是Buffer数据 我们可以调用toString方法转为字符串之后查看
判断文件的状态
fs.stat(targetName, callback)
targetName: 要判断的文件名称
callback: 回调函数,有两个参数:
第一个参数是错误异常
第二个 是状态对象
状态对象:
isDirectory() 判断是文件还是文件夹 true为文件夹 false为文件
isFile() 判断是否为文件
读取文件夹
fs.readdir(dirName, callback)
dirName: 读取的文件夹的名称
callback: 回调函数,有两个参数
第一个参数表示错误异常
第二个参数是一个数组,数组中的每一项都是读取到的每一个文件或者文件夹
检测文件是否存在
fs.exists(path, callback)
path:检测的路径
callback:返回布尔值,存在为true,不存在为false
封装方法 删除非空目录
// 引入方法 let { readdirSync, statSync, unlinkSync, rmdirSync } = require('fs'); function del(dir) { // 防止同步操作出现错误,中断程序执行 try { // 非空目录不能直接删除, // 读取目录中,所有文件和文件夹 let arr = readdirSync(dir); // 逐一遍历,如果文件,将其删除,如果是文件夹递归调用该方法将其内部文件和文件夹删除 // 遍历数组 for (let item of arr) { // 获取完整路径 let path = dir + '/' + item; // item代表目录中的每一个文件或者是文件夹 let state = statSync(path) // console.log(state); // 判断是不是文件夹 if (state.isDirectory()) { // 递归调用删除 del(path) } else { // 直接删除文件 unlinkSync(path) } } // 删除外部的文件夹 rmdirSync(dir) } catch (e) { console.log(e) } } del('a')
上面为同步方法删除非空目录,还可以用promise规范改为用异步方法变为同步写法删除
// 引入方法 let { readdir, stat, unlink, rmdir } = require('fs'); // 使用promise以及async和await技术,将异步写法,变成同步写法。 async function del(dir) { // 获取文件夹中的文件和文件夹 // let arr = readdir(dir, (err, data) => { // console.log(err, data) // }) // console.log(arr); let arr = await new Promise((resolve, reject) => { // 回调函数内部,执行异步 readdir(dir, (err, data) => { // 判断结果 if (err) { // 失败 reject(err) } else { // 成功 resolve(data) } }) }) // console.log(arr); // 遍历结果 for (let item of arr) { // item代表数组的每一项,代表子目录或者文件 // 获取完整的路径 let path = dir + '/' + item; // 获取状态 let isDir = await new Promise((resolve, reject) => { stat(path, (err, data) => { // console.log('inner', err, data) // 如果有出问题 if (err) { reject(err) } else { // 没有问题 // resolve(data) // 返回是不是目录更方便 resolve(data.isDirectory()) } }) }) // console.log('outer', isDir); // 判断是文件还是文件夹 // 如果是目录 if (isDir) { // 是文件夹递归调用 // 递归调用 // del是一个异步方法,我们要等一等 await del(path) } else { // 是文件夹直接删除 // 删除该文件 await new Promise((resolve, reject) => { // 删除文件 unlink(path, (err) => { // 有错误 if (err) { reject(err) } else { // 成功 // 通知外面执行完毕,不需要传递数据 resolve(); } }) }) } } // 删除当前文件夹 await new Promise((resolve, reject) => { // 删除目录 rmdir(dir, err =>{ // 判断错误 if (err) { // 执行失败 reject(err); } else { // 执行成功 resolve() } }) }) } del('a')