Node.js:复制文件时显示进程

时间:2014-06-03 18:51:55

标签: node.js fs

我编写了一个将目录复制到另一个目录的函数......但是存在一个问题:我使用回调函数来发送复制的大小。此回调过早(在副本结束之前)。我认为问题是该过程是异步的。你能救我吗?

var fs=require('fs');
var copyDir=function copyDir(from, to, callback){
if(!fs.existsSync(to)){
    fs.mkdirSync(to);
}
console.log(from+" ==> "+to);
var count = 0;
fs.readdir(from, function(err,files){
    for(var i=0;i<files.length;i++){
        var f = from+"/"+files[i];
        var d = f.replace(from, to);
        console.log(f+" ("+i+")"+ " : "+d);
        if(!fs.existsSync(d)){
            if(!fs.statSync(f).isFile()){
                    //fs.mkdirSync(f.replace(from, to));
                    count += fs.statSync(f).size;
                    console.log(f + " will make an inception!")
                    copyDir(f, f.replace(from, to), function(err, cp){callback(err, cp)});
                }else{
                    var size = fs.statSync(f).size;
                    copyFile(f, f.replace(from, to), function(err){
                        if(err) callback(err, count)
                    });
                    count += size;
                    callback(null, count);
                }
            }
        }
    });
}
function copyFile(source, target, cb) {
    fs.readFile(source, function (err, data) {
    if (err) throw err;
    fs.writeFileSync(target, data, function (err, data){
        if(err) throw err;
        cb(null, fs.statSync(source).size); //This callback comes before the copy end.
    });
    });
}
exports.copyDir = copyDir;

copyDir由:

调用
io.sockets.on('connection', function(socket){   
console.log('connection');
socket.on('startCopy', function(data){
    sizeDir('templates', function(e, r){
        copyDir('templates', 'tmp', function(err, cp){
            console.log("copy % " + Math.round(100*cp/r));
            socket.emit('copy', {prog: Math.round(100*cp/r)});
        });
    });

});
});

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容重写else代码:

(function() {
    var size = fs.statSync(f).size;
    copyFile(f, f.replace(from, to), function(err){
        if(err) {
            callback(err, count);
            return;
        }
        count += size;
        callback(null, count);
    });
})();

但是,您的代码中有很多同步功能。你应该知道这种方法的所有警告。 This article可能会有所帮助