Node.js通过scp监视传入存档的目录

我有一个任务来创build一个node.js脚本,在目录中侦听新的档案文件到达并处理它们。

我看到我可以用fs.watch做到这一点。

这些文件是tar.gz档案,通过scp到达。

问题是新的档案文件的到达似乎在文件系统中创build了多个(确切的数字是不可预知的)事件。 首先是rename ,然后是一些change事件。

当存档完成传输时,我只需要可靠地触发我的处理逻辑一次。 如何才能做到这一点?

补充笔记:

  • 我无法对发送存档的系统进行更改,只有系统接收它。
  • 我不考虑使用时间来猜测SCP事件已经结束。 这是不可靠的。

使用手表库你可以做:

 var watch = require('watch') watch.createMonitor('/home/path', function (monitor) { monitor.on("created", function (file, stat) { // do work with new file }) } 

我build议您利用丰富的图书馆生态系统,因为您使用的是节点平台。 其中一些问题已经为您解决了!

问题是文件传输不是即时的; 你观察到的一系列事件是完全合理的:

  1. 有人开始上传文件。 scp服务器创build一个新文件。 你的观察者看到rename事件。
  2. 字节被发送到您的服务器。 scp服务器将它们写入第1步中的文件。您的观察者看到许多change事件。
  3. 上传完成。 没有进一步的事件产生,因为所有的字节已被写入。

据我所知(基于略读scp的来源 ),没有办法configurationscp服务器在上传实际完成时执行某些操作。 这给你两个select:

  • 去除change事件。 这意味着每次获取change事件并清除前一个定时器时都要设置定时器。 最终,您将停止获取事件,计时器将会启动,并且您可以假定上传已完成。

    这确实会使您容易受到上传失败或中止的影响。

  • 你可以实现你自己的scp服务器。 这很好地概述了协议是如何工作的。 远程scp只是打开一个ssh连接并运行主机的scp命令,然后它有一个简单的文件传输协议。 你必须用你自己的实现来replace你的服务器的scp

    由于该协议告诉你有多less字节的期望,你会知道什么时候收到完整的文件,并可以开始处理。