Skip to content

创建

js
// 父目录 a 必须存在
fs.mkdir('a/b', err => {
  console.log(err)
})

// 目录 a 和 目录 a 下的目录 b 必须存在
fs.mkdir('a/b/c', err => {
  console.log(err)
})

是否是文件夹

js
// 只有儿子那一层
fs.readdir('a', (err, dirs) => {
  dirs.forEach(dir => {
    const _path = path.join('a', dir)

    fs.stat(_path, (err, stat) => {
      const isFile = stat.isFile()
      const isDirectory = stat.isDirectory()
      console.log(isFile, isDirectory)

      if (isFile) {
        // 删除文件
        fs.unlink(_path, () => {})
      }
    })

    return _path
  })
})

删除

删除目录是需要保证目录中的内容是空的,a 下不能有任何东西,包括目录。因此后续遍历先把孩 子内的删除。

js
const fs = require('fs')
const path = require('path')

// 同步删除文件夹
const rmdirSync = (parentDir) => {
  const dirs = fs.readdirSync(parentDir) 

  if (!dirs.length) {
    // 没有任何内容
    fs.rmdirSync(parentDir)

    return
  }

  for (let i = 0, l = dirs.length; i < l; i++) {
    const dir = dirs[i]
    const _path = path.join(parentDir, dir)
    const stat = fs.statSync(_path)
    const isFile = stat.isFile()

    if (isFile) {
      // 删除文件
      fs.unlinkSync(_path)
    } else {
      // 看看文件夹里有没有内容
      rmdirSync(_path)
    }
  }

  fs.rmdirSync(parentDir)
}
js
//       a
//   b.js  c
//           e
//             f.js
const rmdir = (parentDir, cb) => {
  fs.stat(parentDir, (err, stat) => {
    const isFile = stat.isFile()

    if (isFile) {
      // 回调中尝试删除父目录,如果该文件是最后一项才能成功删除。
      fs.unlink(parentDir, cb)
    } else {
      fs.readdir(parentDir, (err, dirs) => {
        if (dirs.length === 0) {
          // 回调中删除父目录
          fs.rmdir(parentDir, cb)
        }

        for (let i = 0, l = dirs.length; i < l; i++) {
          const dir = dirs[i]
          const _path = path.join(parentDir, dir)
    
          rmdir(_path, () => {
            if (i === l - 1) {
              // 子目录已经清空,删除父目录。
              fs.rmdir(parentDir, cb)
            }
          })
        }
      })
    }
  }) 
}