怎么用广度遍历的方法删除一个目录???

630 阅读2分钟

深度遍历与广度遍历

关于对节点的访问顺序,有两种,深度优先遍历和广度有限遍历,具体遍历顺序如下图:

广度遍历删除文件目录

为了清晰每一步的实现,我把文件的目录结构用图来表示,并表明顺序:

下面就开始我们的代码咯,注释写的比较详细,这里就不罗嗦了:

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)
        })
      }
    })
  }

到这里就结束了,如果你有更好的思路和想法,欢迎分享哦!

如果觉得还可以,请点赞鼓励一下,谢谢!