使用node中fs模块操作文件

376 阅读1分钟

创建文件夹

同步创建文件夹

如果需要创建如图所示的文件目录 image.png

思路:

  • 将文件路径切割,并遍历路径,并依次拼接
  • 通过try,catch异常捕获,fs.accessAsync 如果路径不存在则创建
const fs = require("fs");
function mkdirSync(dir) {
    let paths = dir.split("/")
    for (let i = 1; i < paths.length; i++){
        let newPath = paths.slice(0, i).join("/")
        console.log("newPath",newPath)
        try {
          fs.accessSync(newPath)
        } catch (err) {
          fs.mkdirSync(newPath)
        }
    }
}
mkdirSync('A/B/C/', () => {
    console.log("success")
})

异步创建文件夹

思路

  • 通过index指针,拼接出当前的路径,fs.access如果不存在则创建文件夹,如果存在则继续将指针向下移动
function mkdirAsync(dir,cb) {
let index = 1;
let paths = dir.split('/')
function next(index) {
    if (index == paths.length) return cb()
    let newPath = paths.slice(0, index).join('/')
    fs.access(newPath, (err) => {
      if (err) {
        fs.mkdir(newPath, (err) => {
          next(index+1)
        })
      } else {
        next(index+1)
      }
    })
}

mkdirAsync('A/B/C/', () => {
    console.log("success")
})

删除文件夹

同步删除文件夹

思路:

  • fs.readdirSync 同步的读取文件路径的文件情况
  • 遍历文件,如果为文件则直接删除,如果为目录则递归的处理,如果文件删除完毕,则删除目录
function rmkdirSync(dir) {
  let files = fs.readdirSync(dir)
  for (let i = 0; i < files.length; i++) {
    let newPath = path.join(dir, files[i])
    let statObj = fs.statSync(newPath)
    if (statObj.isDirectory()) {
      rmkdirSync(newPath)
    } else {
      fs.unlinkSync(newPath)
    }
  }
  fs.rmdirSync(dir)
}

rmkdirSync('A', () => {
  console.log("success")
})

异步删除文件夹

思路:

  • fs.stat获取文件状态,如果为目录则读取目录所有文件,并拼接路径,对每个路径进行递归的处理,当所有的文件resolve掉后则删除当前目录
  • 如果为文件则直接删除,并resolve当前promise
function rmkdirAsync(dir) {
    return new Promise((resolve, reject) => {
        fs.stat(dir, (err, statObj) => {
          if (statObj.isDirectory()) {
            fs.readdir(dir, (err, files) => {
              files = files.map((file) => path.join(dir, file))
              files = files.map((file) => rmkdirAsync(file))
              Promise.all(files).then(() => {
                fs.rmdir(dir, resolve)
              })
            })
          } else {
            fs.unlink(dir, resolve)
          }
        })
    })
}

rmkdirAsync('A').then(res => {
    console.log('success')
})