banner

NodeJS的mkdir自动创建多级路径的方法

用NodeJS的时候,我在操作日志记录或者文件上传时,难免遇到了路径的创建;执行fs.mkdir会得到报错,创建的路径上一级路径不存在,这时候需要先把上一级路径创建以后,才能继续创建当前路径内容。

这是一个繁琐的判断过程,我干脆写成了一个方法提供给大家使用。

分同步版本和异步版本,跟你的需求来自己确定如何玩。

同步方案

var fs = require('path')
var path = require('path')
/**
 * 同步递归创建路径
 *
 * @param  {string} dir   处理的路径
 * @param  {function} cb  回调函数
 */
var $$mkdir = function(dir, cb) {
    var pathinfo = path.parse(dir)
    if (!fs.existsSync(pathinfo.dir)) {
        $$mkdir(pathinfo.dir,function() {
            fs.mkdirSync(pathinfo.dir)
        })
    }
    cb && cb()
}

$$mkdir(path.join(__dirname, 'demo/test/123/'))

异步方案

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

/**
 * 异步自动创建路径
 */
class Mkdir {
    constructor() {}

    /**
     * 获取路径Stat
     * 参考NodeJS官方文档 或者 linux Stat 相关资料
     * https://nodejs.org/dist/latest-v8.x/docs/api/fs.html#fs_class_fs_stats
     * @param {string} loadpath 读取路径
     */
    getStat(loadpath) {
        return new Promise((resolve, reject) => {
            fs.stat(loadpath, (err, stats) => {
                if (err) {
                    resolve(false)
                } else {
                    resolve(stats)
                }
            })
        })
    }

    /**
     * 创建文件夹
     * @param {string} dir 要创建的文件夹
     */
    mkdir(dir) {
        return new Promise((resolve, reject) => {
            fs.mkdir(dir, (err) => {
                if (err) {
                    console.log(err)
                    resolve(false)
                } else {
                    resolve(true)
                }
            })
        })
    }

    /**
     * 开始处理一个路径
     * 如果发现路径不存在,判断上一级是否存在
     * 如果上一级不存在继续往上一级判断,直到路径存在,开始一层层的反向创建路径
     * 创建成功return true
     * 创建失败return false
     * 如果路径是一个非文件夹的内容,返回 false
     *
     * @return {Boolean}
     */
    async start(dir) {
        let tplPathStat = await this.getStat(dir)
        if (tplPathStat && tplPathStat.isDirectory()) {
            return true
        } else if (tplPathStat) {
            return false
        }

        let pathinfo = path.parse(dir)
        let status = await this.start(pathinfo.dir)
        let mkdirStatus
        if (status) {
            mkdirStatus = await this.mkdir(dir)
        }
        return mkdirStatus && status
    }
}

const mkdir = new Mkdir()

exports = module.exports = (dir) => mkdir.start(dir)

保存为mkdir.js

使用案例

/**
 * 路径创建使用案例
 */

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

const mkdir = require('./mkdir')

;(async () => {
    let pathinfo = path.join(__dirname, './mkdir/demo/test/')
    await mkdir(pathinfo)
    await (() => {
        return new Promise((resolve, reject) => {
            fs.writeFile(path.join(pathinfo, './1.txt'), 'Hello World' + "\n", { flag: 'a' }, (err) => {
                if (err) {
                    console.log(err)
                    resolve(false)
                } else {
                    resolve(true)
                }
            })
        })
    })()
    
    console.log('在', path.join(pathinfo, './1.txt'), '写入', 'Hello World')
})()


阅读: 4918
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
橙色阳光
https://oss.so/article/94

相关阅读

留言评论

暂无留言