nodejs笔记-文件树遍历

遍历文件树,执行删除操作

同步创建文件树

let fs = require("fs")
let { resolve, join } = require("path")

function mkdirSync(paths){
    let arr = paths.split("/").filter(item=>item);
    for(let i=0;i<arr.length;i++){
        let dir = arr.slice(0,i+1).join("/");
        try{
            fs.accessSync(dir)
        }catch(error){
            fs.mkdirSync(dir)
        }
    }
}

// 创建
mkdirSync("a/b/c/d")

异步创建文件树

function mkdir(paths,cb){
    let dir = paths.split("/").filter(f=>f);
    function next(index){
        let p = dir.slice(0,index+1).join("/");
        fs.access(p,(err)=>{
            if (index > dir.length) return cb();
              if (err) {
                fs.mkdir(p,(err)=>next(++index))
              } else {
                  next(++index)
              }
        })
    }
    next(0);
}  
// 创建
mkdir("a/b/c/d",()=>console.log("success"))

删除

// 先序 深度 遍历
function removeDirSync(dir) {
  try {
    let statObj = fs.statSync(dir)
    if (statObj.isDirectory()) {
      fs.readdirSync(dir)
        .filter((d) => d)
        .forEach((d) => removeDirSync(join(dir, d)))
      fs.rmdirSync(dir)
      console.log("rmdirSync", dir)
    } else {
      console.log("unlinjSync", dir)
      fs.unlinkSync(dir)
    }
  } catch (err) {
    console.log("路径不存在", dir)
  }
}

// removeDirSync(resolve(__dirname, "../a"))

// 广度遍历(同步)
function wideSync(dir) {
  let arr = [dir]
  let index = 0
  let current
  while ((current = arr[index++])) {
    let statObj = fs.statSync(current)
    if (statObj.isDirectory()) {
      let dirs = fs.readdirSync(current)
      dirs = dirs.map((d) => join(current, d))
      arr = [...arr, ...dirs]
    }
  }
  for (let i = arr.length - 1; i >= 0; i--) {
    let f = arr[i]
    let statObj = fs.statSync(f)
    if (statObj.isDirectory()) {
      fs.rmdirSync(f)
    } else {
      fs.unlinkSync(f)
    }
  }
}

// wideSync(resolve(__dirname, "../a"))

// 先序 深度 串行
function rmdirSeries(dir, cb=()=>{}) {
  fs.stat(dir,(err,statObj)=>{
    if(err) return console.log(err);
    if(statObj.isDirectory()){
      fs.readdir(dir,(err,dirs)=>{
        dirs = dirs.map(d=>join(dir,d));
        function next(index){
          if(index === dirs.length) return fs.rmdir(dir,cb);
          rmdirSeries(dirs[index],()=>next(index+1))
        }
        next(0)
      })
    }else{
      fs.unlink(dir,(err)=>{
        if(!err) console.log(`unlink ${dir} success!`)
        cb && cb();
      })
    }
  })
}

// rmdirSeries(resolve(__dirname, "../a"), () => console.log("success"))

// 异步 相序 并发 删除
function removeDirParalle(dir,cb){
  fs.stat(dir,(err,statObj)=>{
    if(statObj.isDirectory()){
      fs.readdir(dir, (err,dirs) => {
        if (dirs.length === 0) return fs.rmdir(dir, cb)
        dirs = dirs.map((d) => {
          let nextdir = join(dir, d)
          removeDirParalle(nextdir, done)
          return nextdir
        })
        let index = 0
        function done() {
          if (++index === dirs.length) {
            return fs.rmdir(dir, cb)
          }
        }
      })
    }else{
      fs.unlink(dir,cb)
    }
  })
}

removeDirParalle(resolve(__dirname, "../a"), () => console.log("success"))