如何异步创建文件夹(node)

时间:2021-04-08 12:29:13

    模块fs作为node的核心模块之一,支持本地文件操作的接口,几乎对于所有的操作都提供同步和异步两种方案。例如,创建文件夹有mkdir和mkdirSync。不论对于mkdir还是mkdirSync,都需要注意,只有当上级文件夹存在的时候才能创建文件夹。例如,在当前工作目录下创建dir1/dir2/dir3,需先创建dir1、dir2,才能创建dir3。

    我们先使用同步mkdirSync的方法。  

 1 var fs=require('fs');
 2 var path='dir1/dir2/dir3';
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split('/');
 6     for (var i=0;i<pathAry.length;i++){
 7         var curPath=pathAry.slice(0,i+1).join('/');
 8         var isExist = fs.existsSync(curPath);
 9         !isExist?fs.mkdirSync(curPath):null;
10     }
11 }

     异步方法: 

 

 1 var fs=require('fs');
 2 var path='dir1/dir2/dir3';
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split('/');
 6     for (var i=0;i<pathAry.length;i++){
 7        var curPath=pathAry.slice(0,i+1).join('/');
 8           fs.exists(curPath,function(exists){
 9               if (!exists){
10                   fs.mkdir(curPath,function(){
11                       console.log(curPath+' is created!');
12                   });
13               }
14           })
15     }
16 }

 

   但是第二种方法不能创建任何文件夹。问题在哪里呢?就在fs.exists里。它是异步的,当它的回调函数被执行的时候,外面的循环已经执行完毕,curPath变成了dir1/dir2/dir3。这时候,fs.mkdir(curPath,cb)由于以上提到的原因故而不能创建文件夹。这时候,我们可以利用闭包(自执行函数)来解决这个问题。

 1 var fs=require('fs');
 2 var path='dir1/dir2/dir3';
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split('/');
 6     for (var i=0;i<pathAry.length;i++){
 7        var curPath=pathAry.slice(0,i+1).join('/');
 8         (function(curPath){ //将curPath传入闭包
 9             fs.exists(curPath,function(exists){
10                 if (!exists){
11                     fs.mkdir(curPath,function(){
12                         console.log(curPath+' is created!');
13                     });
14                 }
15             })
16         })(curPath);
17     }
18 }

       当前路径curPath对于闭包来说是私有的,mkdir访问的就是当前作用域的curPath。