一个可以生成多级嵌套文件(文件夹)的小函数
前言
半路出家工作刚满一年的小前端,也是刚学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没多久,但是很喜欢这里,这里的人个个都是人才,说话又好听,我超喜欢这里的)