为什么需要手动实现嵌套文件夹的创建
node中fs模块原生提供了2种创建文件夹的方法:fs.mkdir (异步) 与fs.mkdirSync (同步)。但是原生的方法在创建嵌套文件夹时(如:a/b/c/d)时,必须在父级文件夹存在的情况下才能创建子级文件夹。所以不能一次创建a/b/c/d这样的嵌套文件夹。只能先创建a,再在a文件夹中创建b······
嵌套文件夹创建实现原理
递归调用创建函数,循环遍历路径,一层层判断文件夹是否存在,如果不存在就创建,存在就继续遍历下一层。
代码实现
提供2种方法,一种容易理解,一种比较复杂。123//首先引入依赖var fs=require('fs');var path=require('path')
简单的版本
1234567891011121314151617181920212223242526//简单版本function makeDirp (path) {//分隔符的兼容var sep=path.sep;path=path.replace(/[\\/]/g,sep);var dir=path.split(sep);var index=1;make();//递归调用function make () {if (index>dir.length) return;//每次查找文件夹名+分隔符 是否存在var subdir=dir.slice(0,index++).join(sep);fs.exists(subdir,function (exist) {//存在则继续查找下一级if (exist) {make()//不存在则创建后查找下一级} else {fs.mkdir(subdir,function () {make();})}})}}复杂的版本
12345678910function mkdirp (p,callback) {//判断路径是否存在fs.exists(p,function (exist) {//存在则直接调用回调函数//不存在则递归调用自己,传入当前文件夹所在的文件夹路径return exist?callback():mkdirp(path.dirname(p),function () {fs.mkdir(p,callback);})})}