如何识别node.js中的复制过程何时完成?

时间:2014-03-10 08:30:08

标签: javascript node.js

这是我在node.js的第一步。我将使用 chokidar 查看添加文件的目录。如果复制过程完成,则应调用脚本。但我不知道如何识别复制过程何时完成并且文件在我的目录中完整可用。带有完成一词的控制台日志命令永远不会出现。

var fs       = require('fs');
var chokidar = require('chokidar');

var watcher = chokidar.watch('/root/Documents/gw/', {ignored: /^\./, persistent: true});

watcher
   .on('add', function(path) {

    console.log('File', path, 'has been added');

    fs.watchFile(path, function(curr, prev) {

      if (curr.size == prev.size) {
          console.log('finish');
          // TODO start a shell script 
      } else                     {
          console.log(curr.size);
      }
    });
});

我在Linux系统上使用node.js版本0.10.25。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

您的测试永远不会是正面的原因是,在简单的复制操作fs.watchFile上,不会生成前一个大小将等于当前大小的事件。为此,必须对文件进行更改,因为fs.watchFile仅在更改时触发。但是在简单的复制操作中,通常不会发生先前大小和当前大小相同的文件更改。

这是一个解决方案,可以检测文件在设置的超时后停止更改的时间:

var fs       = require('fs');
var chokidar = require('chokidar');

var watcher = chokidar.watch('dir', {ignored: /^\./, persistent: true});

var end_timeout = 30000;

watcher
    .on('add', function(path) {

        console.log('File', path, 'has been added');

        fs.stat(path, function (err, stat) {
            // Replace error checking with something appropriate for your app.
            if (err) throw err;
            setTimeout(checkEnd, end_timeout, path, stat);
        });
});

function checkEnd(path, prev) {
    fs.stat(path, function (err, stat) {

        // Replace error checking with something appropriate for your app.
        if (err) throw err;
        if (stat.mtime.getTime() === prev.mtime.getTime()) {
            console.log("finished");
            // Move on: call whatever needs to be called to process the file.
        }
        else
            setTimeout(checkEnd, end_timeout, path, stat);
    });
}

请注意,如果目录预先填充了文件,则此代码将立即开始观看。我可以想象这是可取的情况,有些则不是。