Node.JS循环删除非空文件夹及子目录下的所有文件

2018-03-12 月华如水

最近要实现一个循文件夹的功能,文件夹可能不是空的,还可能带有子文件夹和文件,网上找了一些现有的库,但是都不提供删除进度。所以就自己写了一个。

var fs    = require('fs')
var path  = require('path')

var remove = function(tarPath, cb, removeStates) {
  if (!removeStates) {
    removeStates = { cur: 0, all: 0 }
  } else {
    if (!removeStates.cur) {
      removeStates.cur = 0;
    }
    if (!removeStates.all) {
      removeStates.all = 0;
    }
  }
  removeStates.all++;
  fs.stat(tarPath, function(err, states) {
    removeStates.cur++;
    if (err) {
      cb && cb()
      return
    }
    if (states.isDirectory()) {
      fs.readdir(tarPath, function(err, files) {
        if (err) {
          console.log(err)
          cb && cb()
          return
        }
        if (files.length < 1) {
          fs.rmdir(tarPath, cb)
          return
        }
        var count    = 0
        var checkEnd = function() {
          if (++count == files.length) {
            fs.rmdir(tarPath, cb)
          }
        }
        files.forEach(function(file) {
          remove(path.join(tarPath, file), checkEnd, removeStates)
        })
      })
    } else {
      fs.unlink(tarPath, function(err) {
        if (err) {
          console.log(err)
        }
        cb && cb()
        return
      })
    }
  })
  return removeStates
}

使用很简单

var states = remove('./testdir', function() {
    console.log('delete complete')
    clearInterval(checkTimer)
});
var checkTimer = setInterval(function() {
    console.log(states)
}, 500);

输出结果:

node remove.js
{ cur: 546, all: 546 }
delete complete