怎麼用廣度遍歷的方法刪除一個目錄???

深度遍歷與廣度遍歷

關於對節點的訪問順序,有兩種,深度優先遍歷和廣度有限遍歷,具體遍歷順序以下圖: 數組

廣度遍歷刪除文件目錄

爲了清晰每一步的實現,我把文件的目錄結構用圖來表示,並代表順序: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

相關文章
相關標籤/搜索