gpt4 book ai didi

javascript - 如何确定 node.js 中的复制过程何时完成?

转载 作者:行者123 更新时间:2023-11-30 10:18:58 25 4
gpt4 key购买 nike

这是我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com