如何異步創建文件夾(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。

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM