關於對節點的訪問順序,有兩種,深度優先遍歷和廣度有限遍歷,具體遍歷順序以下圖: 數組
爲了清晰每一步的實現,我把文件的目錄結構用圖來表示,並代表順序: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