这是我使用 node.js 的第一步。我将使用 chokidar 查看目录以查找添加的文件。如果复制过程完成,则应调用脚本。但是我不知道如何确定复制过程何时完成以及文件在我的目录中是否完整可用。永远不会出现带有单词 finish 的控制台日志命令。
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。
在此先感谢您的帮助!
最佳答案
您的测试永远不会是正面的原因是,在简单的复制操作中,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);
});
}
请注意,如果目录中预先填充了文件,此代码将立即开始监视它们。我可以想象在哪些用例场景中需要这样做,而在一些情况下则不需要。
关于javascript - 如何确定 node.js 中的复制过程何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22295290/