深度遍历与广度遍历
关于对节点的访问顺序,有两种,深度优先遍历和广度有限遍历,具体遍历顺序如下图:
广度遍历删除文件目录
为了清晰每一步的实现,我把文件的目录结构用图来表示,并表明顺序:
下面就开始我们的代码咯,注释写的比较详细,这里就不罗嗦了:let fs = require('fs');
let path = require('path');
function preWide(dir){
let disArr=[dir] //[ 'a' ]
//广度遍历,就是一层一层遍历,索引,从0开始
next(0)
function next(index){
console.log(index,disArr)
fs.stat(disArr[index],(err,stats)=>{
if(stats.isDirectory()){ //如果是文件夹,读取文件夹的内容
fs.readdir(disArr[index],(err,dirs)=>{ // index=0,dirs=[ 'a.js', 'b', 'd' ]
dirs=dirs.map(item=>path.join(disArr[index],item)) //把每一项拼接为路径
disArr=[...disArr,...dirs] // index=0,disArr = [ 'a', 'a\\a.js', 'a\\b', 'a\\d' ]
//此时,index = 0 ,第一层遍历完毕,我们需要对第二层进行判断,循环 next() ,index+1,依此类推。。。
next(index+1)
})
}else{ //不是文件夹就是文件,如果是文件,就让index+1,调用next()
next(index+1)
}
})
}
}
preWide("a")
这样,通过 next() 方法,利用 index+1 ,就会不断的顺着目录找下去。。。找下去。。。 突然,找到头了怎么办?报错了。。。我们需要在它找到头的时候阻止它继续往下找,什么情况下,我们知道到头了呢?
看出来了吧?index 等于 数组长度 的时候就找完了,那我们就阻止它继续找,并且开始删除工作!在开始判断之前,我们加一句 if(index == disArr.length) return
function next(index){
console.log(index,disArr)
if(index == disArr.length) return
fs.stat(disArr[index],(err,stats)=>{
。。。。。。
})
}
写一个删除的方法吧,还是根据索引,从数组里删除咯!
function rmDir(index){
if(index < 0) return //索引小于0 的时候就删除完毕
fs.stat(disArr[index],(err,stats)=>{ //根据路径获取该目录信息
if(stats.isDirectory()){ //是文件夹
fs.rmdir(disArr[index],(err)=>{ //异步删除文件夹
if(err){
throw err;
}else{
rmDir(index-1)
}
})
}else{ //是文件
fs.unlink(disArr[index],(err)=>{ //异步删除文件
if(err){
throw err;
}
rmDir(index-1)
})
}
})
}
到这里就结束了,如果你有更好的思路和想法,欢迎分享哦!
如果觉得还可以,请点赞鼓励一下,谢谢!