node.js|nodeJS删除非空文件夹(通过递归和nodeJS对于文件和文件夹的相关操作)

主要是因为在网上查找时,能够有助于理解的太少 。一版为自己写的一版为听老师讲的

// 删除有文件的文件夹? // 如删除images文件夹(不能手动删除) // images/01.png // images/02.jpg // images/tabbar/01.jpgimages/tabbar/02.jpg // images/upload/01.jpgimages/upload/02.jpglet fs = require("fs") const { readdir } = require("fs/promises"); fs.readdir("./images", (err, files) => { if (err) { console.log(err); } else { // 先循环最外层的文件夹 for (let i = 0; i < files.length; i++) { // 将路径保存成一个常量 const statData = https://www.it610.com/article/`./images/${files[i]}` console.log(statData); // 判断这个常量是文件还是文件夹 fs.stat(statData, (err, data) => { if (err) { console.log(err); } else { // 如果是文件就删除 if (data.isFile()) { console.log("是文件"); fs.unlink(statData, (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } }) // 如果是文件夹,就再次遍历 } else if (data.isDirectory()) { // 第二层是文件 fs.readdir(statData, (err, files2) => { if (err) { console.log(err); } else { // console.log(files2); for (let j = 0; j < files2.length; j++) { // 保存第二层的路径 const statData2 = `${statData}/${files2[j]}` // console.log(statData2); // 判断是否为文件 fs.stat(statData2, (err, data) => { if (err) { console.log(err); } else {if (data.isFile()) { fs.unlink(statData2, (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } }) } } }) } fs.rmdir(statData, (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } }) } })} } }) } } }) fs.rmdir("./images", (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } })

这个是理解过程,注意是用判断和循环
还用到了关于nodeJS中关于文件和文件夹的操作

以下是使用递归写出来的效果
// 删除有文件的文件夹? // 如删除images文件夹(不能手动删除) // images/01.png // images/02.jpg // images/tabbar/01.jpgimages/tabbar/02.jpg // images/upload/01.jpgimages/upload/02.jpglet fs = require("fs") const { readdir } = require("fs/promises"); // 封装函数,使用递归 function deleteFiles(filesName) { fs.readdir(filesName, (err, files) => { if (err) { console.log(err); } else { if (files.length === 0) { fs.rmdir(filesName, (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } }) } else { for (let i = 0; i < files.length; i++) { // 保存路径 const statData = https://www.it610.com/article/`${filesName}/${files[i]}` // console.log(statData); // 判断是否为文件 fs.stat(statData, (err, data) => { if (err) { console.log(err); } else { if (data.isFile()) { fs.unlink(statData, (err) => { if (err) { console.log(err); } else { console.log("删除成功"); } }) } else if (data.isDirectory()) { deleteFiles(statData) } } }) } deleteFiles(filesName) } } }) } deleteFiles("./images")

思路:通过传入一个需要删除的文件夹路径,先使用NodeJs中的fs模块readdir()对文件夹进行读取,因为他是一个数组,所以先判断这个文件夹是否为空数组,如果为空数组,就删除该文件夹,如果不为空,就遍历这个文件夹,先判断是否为文件,如果是文件就删除文件,如果不是就再次执行函数,直到删除这个文件夹,我的步骤中缺点也比较明显,在遍历是会有很多代码冗余,因为遍历之后再次执行这个函数导致会再次遍历,但其实内容已经被删除了。


【node.js|nodeJS删除非空文件夹(通过递归和nodeJS对于文件和文件夹的相关操作)】老师代码
let fs = require("fs"); function deleFile(path, parentPath) { if (fs.statSync(path).isDirectory()) { let files = fs.readdirSync(path) //files得到一个数组 ['01.jpg','02.png','tabbar','upload'] files.forEach((file, index) => { let currentPath = path + "/" + file //currentPath-->./images/01.jpg./images/02.png./images/tabbar./images/upload if (fs.statSync(currentPath).isDirectory()) { //如果条件为真 说明 currentPath是一个目录 deleFile(currentPath, path) } else { //currentPath说明是一个文件 fs.unlinkSync(currentPath) } }) if (path != parentPath) { fs.rmdirSync(path) } } else { fs.unlinkSync(path) } }deleFile("./images", "../day02")

其中使用了一些补充知识
let fs = require("fs"); fs.readFile("./a.txt", (err, data) => { // console.log(data.toString()); console.log("a"); }) fs.readFile("./b.txt", (err, data) => { console.log(data.toString()); console.log("b"); })console.log(fs.readFileSync("./a.txt").toString()); console.log(fs.readFileSync("./b.txt").toString()); // fs.readdir()异步的 // fs.readdirSync() //同步// fs.readFile()//异步 // fs.readFileSync() //同步


    推荐阅读