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

标签 javascript node.js

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

相关文章:

node.js - RabbitMQ + Node.JS 连接问题,帧大小太大?

javascript - NodeJs - 如何在呈现的 EJS 中呈现 EJS?

javascript - 如果选项包含子字符串,则使用字符串数组和嵌套循环从下拉列表中选择选项

javascript - HTML 网站在执行 JavaScript 时崩溃

node.js - ng build --prod 不适用于 Docker 容器

node.js - 为什么 node.js Express 服务器只处理每个客户端对同一路由的一个请求?

javascript - IE6 : Doesn't load Google Maps API v3

javascript - 用鼠标绘制矩形(div)

javascript - 在 ReactJS 中每秒更新一次时钟元素

node.js - Node.js 中发生错误时保持在同一页面