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