纯异步nodejs文件夹(目录)复制功能
node.js复制文件夹
思路:
1、callback驱动
2、递归所有需要复制文件
3、在一定阀值下并发复制文件
varasync=require("async");
varfs=require("fs");
varpath=require("path");
//cursivelymakedir
functionmkdirs(p,mode,f,made){
if(typeofmode==='function'||mode===undefined){
f=mode;
mode=0777&(~process.umask());
}
if(!made)
made=null;
varcb=f||function(){};
if(typeofmode==='string')
mode=parseInt(mode,8);
p=path.resolve(p);
fs.mkdir(p,mode,function(er){
if(!er){
made=made||p;
returncb(null,made);
}
switch(er.code){
case'ENOENT':
mkdirs(path.dirname(p),mode,function(er,made){
if(er){
cb(er,made);
}else{
mkdirs(p,mode,cb,made);
}
});
break;
//Inthecaseofanyothererror,justseeifthere'sadir
//therealready.Ifso,thenhooray!Ifnot,thensomething
//isborked.
default:
fs.stat(p,function(er2,stat){
//ifthestatfails,thenthat'ssuperweird.
//lettheoriginalerrorbethefailurereason.
if(er2||!stat.isDirectory()){
cb(er,made);
}else{
cb(null,made)
};
});
break;
}
});
}
//singlefilecopy
functioncopyFile(file,toDir,cb){
async.waterfall([
function(callback){
fs.exists(toDir,function(exists){
if(exists){
callback(null,false);
}else{
callback(null,true);
}
});
},function(need,callback){
if(need){
mkdirs(path.dirname(toDir),callback);
}else{
callback(null,true);
}
},function(p,callback){
varreads=fs.createReadStream(file);
varwrites=fs.createWriteStream(path.join(path.dirname(toDir),path.basename(file)));
reads.pipe(writes);
//don'tforgetclosethewhenallthedataareread
reads.on("end",function(){
writes.end();
callback(null);
});
reads.on("error",function(err){
console.log("erroroccurinreads");
callback(true,err);
});
}
],cb);
}
//cursivelycountthefilesthatneedtobecopied
function_ccoutTask(from,to,cbw){
async.waterfall([
function(callback){
fs.stat(from,callback);
},
function(stats,callback){
if(stats.isFile()){
cbw.addFile(from,to);
callback(null,[]);
}elseif(stats.isDirectory()){
fs.readdir(from,callback);
}
},
function(files,callback){
if(files.length){
for(vari=0;i
总结
以上所述是小编给大家介绍的纯异步nodejs文件夹(目录)复制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!