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

这篇博客介绍了如何使用Node.js的fs模块递归删除包含文件的文件夹。首先展示了两种实现方式,一种是通过循环判断文件或文件夹并逐层删除,另一种是采用递归函数实现。在老师的代码中,通过fs模块的同步方法实现了更简洁的文件夹删除操作。同时,文中还提及了fs模块中readDir和readDirSync、readFile和readFileSync的区别。
摘要由CSDN通过智能技术生成

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

// 删除有文件的文件夹?
// 如  删除images文件夹(不能手动删除)
// images/01.png  
// images/02.jpg
// images/tabbar/01.jpg   images/tabbar/02.jpg
// images/upload/01.jpg   images/upload/02.jpg

let 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 = `./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.jpg   images/tabbar/02.jpg
// images/upload/01.jpg   images/upload/02.jpg


let 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 = `${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()对文件夹进行读取,因为他是一个数组,所以先判断这个文件夹是否为空数组,如果为空数组,就删除该文件夹,如果不为空,就遍历这个文件夹,先判断是否为文件,如果是文件就删除文件,如果不是就再次执行函数,直到删除这个文件夹,我的步骤中缺点也比较明显,在遍历是会有很多代码冗余,因为遍历之后再次执行这个函数导致会再次遍历,但其实内容已经被删除了。

老师代码

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() //同步

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值