你的位置:首页 > Java教程

[Java教程]如何异步创建文件夹(node)

    模块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。