关于对节点的访问顺序,有两种,深度优先遍历和广度有限遍历,具体遍历顺序以下图: 数组
为了清晰每一步的实现,我把文件的目录结构用图来表示,并代表顺序: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 ,就会不断的顺着目录找下去。。。找下去。。。 忽然,找到头了怎么办?报错了。。。咱们须要在它找到头的时候阻止它继续往下找,什么状况下,咱们知道到头了呢?异步
在开始判断以前,咱们加一句 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