手写一个递归循环创建目录(内含详细注释)

var fs = require('fs');
var path = require('path');

// 递归创建目录
function myMkdirSync(dirname) {
    
    
  // 判断当前目录是否创建,第一次进来,肯定是没创建的,如果创建了,就不创建了
  if (fs.existsSync(dirname)) {
    
    
    return true;
  } else {
    
    
    // 如果父级目录已经创建,然后才能创建子级目录
    /* 
      假设参数为 a/b/c    那么path.dirname(dirname)会返回a/b  至于为什么返回 a/b 视频中已经详细讲解,可以自己手动测试
      
      第一次执行if小括号:运行myMkdirSync(a/b)  那么还会进入当前else分支,然后又会执行if判断,这时path.dirname(dirname)会返回a  
                    
                  !!!!! 重点:这时if小括号内容执行完后会继续执行,并没有去执行后边中括号内部的逻辑代码 !!!!!

      第二次执行if小括号:运行myMkdirSync(a)  那么还会进入当前else分支,然后又会执行if判断,这时path.dirname(dirname)会返回当前这个fs.js所在父级目录

      第三次执行if小括号:运行myMkdirSync(父级目录)  那么因为父级目录是确实存在的,所以会返回true,也就是第8行代码

                  !!!!! 然后返回true后,开始执行if判断了 !!!!!

      第一次执行if中括号:对照的是第三次执行if小括号,也就是说,这时候的参数 diranme 为a (这时不要以为参数是 父级目录,父级目录是 path.dirname(dirname) 返回的结果,我们的参数是 dirname 而此时他的值为 a)
                  !!!!! 这时创建了一个目录为a,并且返回一个true !!!!!
      
      因为上次执行完后,返回一个 true,所以,第二次执行if小括号的返回值就是 true  这时候的参数 diranme 为a/b
                  !!!!! 这时在目录a下 创建了一个目录为b,并且返回一个true !!!!!

      又因为上次执行完后,返回一个 true 所以,第一次执行if小括号的返回值就是 true   这时候的参数 diranme 为a/b/c
                  !!!!! 这时在目录a下的目录b下 创建了一个目录为c,并且返回一个true !!!!!

    */ 
    if (myMkdirSync(path.dirname(dirname))) {
    
    
      fs.mkdirSync(dirname);
      return true;
    }
  }
}

myMkdirSync('a/b/c');

猜你喜欢

转载自blog.csdn.net/CS_DGD/article/details/113151989