node源码实现——嵌套文件夹的创建

为什么需要手动实现嵌套文件夹的创建

node中fs模块原生提供了2种创建文件夹的方法:fs.mkdir (异步) 与fs.mkdirSync (同步)。但是原生的方法在创建嵌套文件夹时(如:a/b/c/d)时,必须在父级文件夹存在的情况下才能创建子级文件夹。所以不能一次创建a/b/c/d这样的嵌套文件夹。只能先创建a,再在a文件夹中创建b······

嵌套文件夹创建实现原理

递归调用创建函数,循环遍历路径,一层层判断文件夹是否存在,如果不存在就创建,存在就继续遍历下一层。

代码实现

提供2种方法,一种容易理解,一种比较复杂。

1
2
3
//首先引入依赖
var fs=require('fs');
var path=require('path')

  • 简单的版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    //简单版本
    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();
    })
    }
    })
    }
    }
  • 复杂的版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function mkdirp (p,callback) {
    //判断路径是否存在
    fs.exists(p,function (exist) {
    //存在则直接调用回调函数
    //不存在则递归调用自己,传入当前文件夹所在的文件夹路径
    return exist?callback():mkdirp(path.dirname(p),function () {
    fs.mkdir(p,callback);
    })
    })
    }