
NodeJS的mkdir自动创建多级路径的方法
😂 这篇文章最后更新于1150天前,您需要注意相关的内容是否还可用。
[update: 2019/05/27]
NodeJS 10以后的版本,fs.mkdir已经增加递归选项啦;
参考文档:NodeJS File System
fs.mkdir('/tmp/test/www.inull.cn', { recursive: true }, (err) => { if (err) throw err; });
推荐使用官方方案
【以下内容,适用于NodeJS 9以前版本】
用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') })()