因为nodejs的mkdir和mkdirSync本身都不能一次性建立多级目录,所以只能自行编写代码了。
同步模式的递归建立可以写成这样:
var fs=require('fs');
var path=require('path');
function mkdirSync(dir){
var dirlist=path.resolve(dir).split(path.sep);
var level=0;
// 容错建立
while(dirlist.length>=level)try{
fs.mkdirSync(dirlist.slice(0,level++).join(path.sep));
}catch(e){}
try{
// 判断文件夹是否存在
if(!fs.statSync(dir).isDirectory())0();
}catch(e){
return false; // 建立失败
}
return true; // 建立成功
}
console.log(mkdirSync('/1/2/3/4/5/6/7/8')?'success':'fail');
异步模式也是需要依赖递归的,直接使用callback嵌套写法看上去代码很混乱,而使用Promise就很清晰了,因为Promise的thenable如果返回的是Promise对象,会让执行队列等待这个Promise完成。这种方式可以想象成是一个异步的阻塞,既确保了目录建立的顺序,也避免了同步建立导致整个线程被阻塞。
var fs=require('fs');
var path=require('path');
function mkdir(dir){
var dirlist=path.resolve(dir).split(path.sep);
return function callee(last,level){
return dirlist.length>=level?callee(last.then(function(){
return new Promise(function(resolve){
fs.mkdir(dirlist.slice(0,level).join(path.sep),resolve);
});
}),level+1):last.then(function(){
return new Promise(function(resolve,reject){
fs.stat(dir,function(e,stats){
if(e || !stats.isDirectory())
throw e||'directory not exists'; // 建立失败
resolve(); // 建立成功
});
});
});
}(Promise.resolve(),0);
};
mkdir('/a/b/c/d/e/f').then(function(){
console.log('success');
},function(){
console.log('fail');
});
相关文档
暂无
随便看看
畅言模块加载中