如何确定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。

预先感谢您的帮助!

您的testing永远不会是积极的原因是,在简单的复制操作fs.watchFile不会生成一个事件,其中以前的大小将等于当前的大小。 要发生这种情况,必须对文件进行更改 ,因为fs.watchFile只会触发更改 。 但是,在一个简单的复制操作中,通常不会在先前大小和当前大小相同的情况下发生文件更改。

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

 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); }); } 

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