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