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

深度遍历与广度遍历

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

广度遍历删除文件目录

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

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

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

function next(index){
    console.log(index,disArr)
    if(index == disArr.length) return
    fs.stat(disArr[index],(err,stats)=>{
       。。。。。。
    })
  }
复制代码

写一个删除的方法吧,仍是根据索引,从数组里删除咯!ui

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)
        })
      }
    })
  }
复制代码

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

若是以为还能够,请点赞鼓励一下,谢谢!3d

相关文章
相关标签/搜索