• 由于删除目录只能删除空目录(如果有子文件或文件夹要先删除)
  • 目录结构算是典型的二叉树模型,所以涉及到遍历树结构
  • 二叉树遍历(分为深度和广度,以及先序,中序,后序之分)
  • 以下以深度先序解决目录删除
  • 在node中由于主线程为单线程, 可以采取串行方式和并行方式

深度先序(串行 回调方式)

const fs = require('fs')const path = require('path')function rmdir(filePath, callback) {    // 先判断当前filePath的类型(文件还是文件夹,如果是文件直接删除, 如果是文件夹, 去取当前文件夹下的内容, 拿到每一个递归)    fs.stat(filePath, function(err, stat) {        if(err) return console.log(err)        if(stat.isFile()) {            fs.unlink(filePath, callback)        }else {            fs.readdir(filePath, function(err, data) {                if(err) return console.log(err)                let dirs = data.map(dir => path.join(filePath, dir))                let index = 0                !(function next() {                    // 此处递归删除掉所有子文件 后删除当前 文件夹                    if(index === dirs.length) {                        fs.rmdir(filePath, callback)                    }else {                        rmdir(dirs[index++],next)                    }                })()            })        }    })}rmdir('a', function() {    console.log('删除成功')})

深度先序 (串行 promise写法)

const fs = require('fs')const path = require('path')function rmdirPromise(filePath) {    return new Promise((resolve, reject) => {        fs.stat(filePath, function(err, stat) {            if(err) reject(err)            if(stat.isFile()) {                fs.unlink(filePath, function(err) {                    if(err) reject(err)                    resolve()                })            }else {                fs.readdir(filePath, function(err, dirs) {                    if(err) reject(err)                    dirs = dirs.map(dir => path.join(filePath, dir))  // a/b  a/c                    let index = 0;                    (function next() {                        if(index === dirs.length) {                            fs.rmdir(filePath, function(err) {                                if(err) reject(err)                                resolve()                            })                        }else {                            rmdirPromise(dirs[index++]).then(() => {                                next()                            }, err => {                                reject(err)                            })                        }                    })()                })            }        })    })}rmdirPromise('a').then(() => {    console.log('删除成功')})

深度先序 (串行 async await写法)

// 在node v10.0.0+版本中fs模块提供 promise 写法 const fs = require('fs').promises// 如果在node 10之前的版本中可以引入第三方模块 mz const fs = require('mz/fs') 用法一致  https://www.npmjs.com/package/mzconst fs = require('fs').promisesconst path = require('path')async function rmdirAsync(filePath) {    let stat = await fs.stat(filePath)    if (stat.isFile()) {        await fs.unlink(filePath)    } else {        let dirs = await fs.readdir(filePath)        dirs = dirs.map(dir => path.join(filePath, dir))        let index = 0;        (async function next() {            if (index === dirs.length) {                await fs.rmdir(filePath)            } else {                await rmdirAsync(dirs[index++])                await next()            }        })()    }}rmdirAsync('a').then(() => {    console.log('删除成功')}, (err) => {    console.log('err', err)})