一个可以生成多级嵌套文件(文件夹)的小函数
发布于 6 年前 作者 wsmwzms123 1369 次浏览 来自 分享

前言

半路出家工作刚满一年的小前端,也是刚学node(怀揣着一颗全栈(沾)的梦想我会乱说?),在用node生成文件或者文件夹的时候发现居然不能嵌套,于是有了下面这个小工具函数

主体

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

/**
 * 
 * 
 * @param {String} paths of creating files or folders
 * @param {Array|String} contents of files you creating
 * @param {Function} callback 
 */
function mkdirs (paths, contentsArr, callback) {
  if (!paths || typeof paths !== 'string') return
  if (typeof contentsArr === 'function') {
    callback = contentsArr
    contentsArr = []
  }
  if (contentsArr && !Array.isArray(contentsArr)) {
    contentsArr = [contentsArr]
  }
  callback = callback || function (err) { console.log(err) }
  const {base, dir, ext} = path.parse(paths)
  const dirnameArr = dir.split(/\\|\//)
  let dirname = ''
  function mk (err) {
    if (dirnameArr.length) {
      let arrShift, currentPath = ''
      while (/^\.{1,2}$/.test(arrShift = dirnameArr.shift())) {
        currentPath += (arrShift + '/')
      }
      dirname += (currentPath ? dirname ? '/' : '' : '') + currentPath + (arrShift ? ((!currentPath ? '/' : '') + arrShift) : '')
      if (/\./.test(arrShift)) {
        fs.writeFile(dirname, contentsArr.shift() || '', err => {
          dirname = dirname.slice(0, -(arrShift.length + 1))
          mk(err)
        })
      } else {
        fs.mkdir(dirname, mk.bind)
      }
    } else {
      if (ext) {
        fs.writeFile(dirname + '/' + base, contentsArr.shift() || '', err => {
          callback(err, paths)
        })
      } else {
        fs.mkdir(dirname + '/' + base, err => {
          callback(err, paths)
        })
      }
    }
  }
  mk()
}

exports = module.exports = mkdirs

用法

const mkdirs = require('mkdirs')
mkdirs('./aaa/bbb/ccc/ddd/eee/fff/ggg', callback)
mkdirs('./aaa/bbb/ccc/./.././bbb.txt/ddd/eee/fff/haha.txt', 'this is text content', callback)
mkdirs('./aaa.txt/bbb.csv/../ccc.//./././fff/ttt.png', [textFile, csvFile, imageFile], callback)

因为本身实力有限加上技术文章写的不多,写的不好的地方,还请大家能够指出来,多谢。(刚来cnodejs没多久,但是很喜欢这里,这里的人个个都是人才,说话又好听,我超喜欢这里的)

回到顶部