node 刪除並複製文件

功能:刪除dist目錄的所有文件夾,並將src目錄的文件全部複製到dist目錄

這裏並沒有使用異步刪除,因爲異步刪除和異步複製同時進行會有問題。暫時沒有很好地解決辦法。當然異步刪除速度更快。

const fs = require('fs');
const DIST = './dist'
const SRC = './src'

//同步刪除所有文件
const delDir = function(path){
  var files = [];
  if(fs.existsSync(path)){//檢查文件是否存在
    files = fs.readdirSync(path)//讀取所有的文件
    files.forEach(function(file){
      let pathFile = path+'/'+file;
      let stats = fs.statSync(pathFile)
      if(stats.isDirectory()){
        delDir(pathFile)//遞歸刪除
      }else{
        fs.unlinkSync(pathFile)//刪除文件
      }
    })
    fs.rmdirSync(path)//刪除文件件
    console.log(1)
    console.log("SUCCESS RM DIR", path)
  }
}
console.time('del')
delDir(DIST)
console.timeEnd('del')

var copy = function(src,dist){
  fs.readdir(src,function(err,paths){
    if(err) throw err;
    paths.forEach(function(path){
      var _src = src + '/' + path;
      var _dist = dist + '/' + path;
      fs.stat(_src,function(err,stats){
        if(err) throw err;
        if(stats.isFile()){
          var readable = fs.createReadStream(_src)
          var writeable = fs.createWriteStream(_dist)
          readable.pipe(writeable)
        }else if(stats.isDirectory()){
          console.log('3')
          checkDirectory(_src, _dist, copy)
        }
      })
    })
  })
}
var checkDirectory = function(src,dist,callback){
  fs.access(dist, fs.constants.F_OK, err => {
    if(err){
      fs.mkdir(dist,function(){
        callback(src,dist)
      })
    }else{
      callback(src,dist)
    }
  })
}

console.time('copy')
checkDirectory(SRC,DIST,copy)
console.timeEnd('copy')
console.log('2')

###異步刪除

function rmdirp(dir) {
  return new Promise((resolve, reject) => {
      fs.stat(dir, function (err, status) {
          if (status.isDirectory()) { //是文件夾
              fs.readdir(dir, function (err, file) {
                  let res = file.map((item) => rmdirp(path.join(dir, item)))
                  Promise.all(res).then( () => { //當所有的子文件都刪除後就刪除當前文件夾
                      fs.rmdir(dir, resolve);
                  })
              })
          } else {
              fs.unlink(dir, resolve);
          }
      })
  })
}
console.time('del')
rmdirp('./dist')
console.timeEnd('del')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章