【问题标题】:How to detect FTP file transfer completion?如何检测 FTP 文件传输完成?
【发布时间】:2011-04-11 17:59:04
【问题描述】:

我正在编写一个脚本,用于轮询 FTP 站点的文件并在可用时将它们下载到本地。这些文件由各个来源方随机存放到 FTP 站点。我需要一种方法来检测 FTP 站点上的文件是否已被源方完全传输,然后再下载它们。有什么想法可以解决这个问题吗?

【问题讨论】:

  • 这是一个很常见的问题。我解决了一次,虽然不是很优雅,通过检查文件的大小,然后再次检查它。如果大小在 5 秒窗口内发生变化,可能仍在写入。我试过锁——不好。
  • P.S.我还先处理了最早的文件,所以我唯一需要等待的就是处理最新的文件或三个文件。

标签: perl ftp transfer


【解决方案1】:

如果您可以控制客户端,更安全、更清洁、更有效的方法是让客户端执行以下操作:

  1. 将文件上传到 ..../partial/somefile
  2. 将 ..../partial/somefile 重命名为 ..../complete/somefile

这会导致文件同时出现在后一个目录中,因此您所要做的就是扫描该目录。如果您需要非轮询解决方案,您甚至可以要求操作系统通知该目录的添加。

【讨论】:

    【解决方案2】:

    如果您无法操作 FTP 服务器本身,我想到的唯一检查方法是轮询文件大小,如果文件大小在较长时间内没有改变,您可以确定上传已完成。但没有人能保证。理想情况下,您可以调整 FTP 服务器并使其在完成一些上传后执行一些脚本。

    一些伪代码:

    my %filesizes;
    my %processed;
    
    sub poll {
        foreach (@files_on_ftp) {
             if($_->filesize == $filesizes{$_->filename} and not $processed{$_->filename}) {
                 process($_);
                 $processed{$_->filename)++;
             }
        }
    }
    

    【讨论】:

      【解决方案3】:

      就像ikegami的解决方案取决于我的客户端:

      1. 首先是文件上传
      2. 如果完成,客户端上传空标志文件(如file.name.txt.finished

      当你看到finished-file 时,你就知道文件准备好了。

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        相关资源
        最近更新 更多