4

我们有一个 ftp 系统设置来监控/从不受我们控制的远程 ftp 服务器下载。该脚本连接到远程 ftp,并获取服务器上文件的文件名,然后我们检查它是否已下载。如果尚未下载,则我们下载文件并将其添加到列表中。

我们最近遇到了一个问题,远程 ftp 端的某个人将复制一个巨大的单个文件(> 1GB),然后脚本将唤醒并看到一个新文件并开始下载正在复制的文件。

检查这个的最好方法是什么?我想抓住文件大小等待几秒钟再次检查文件大小,看看它是否增加了,如果没有,那么我们下载它。但是由于时间很重要,我们不能为每个文件集等待几秒钟,看看它的文件大小是否增加了。

最好的方法是什么,目前一切都是通过pythons ftplib完成的,除了使用上述方法之外,我们怎么能做到这一点。

让我再次重申这一点,我们对远程 ftp 站点的控制为 0。

谢谢。

更新1:

我在想如果我尝试重命名它会怎样......因为我们对 ftp 拥有完全权限,如果文件上传正在进行中,重命名命令会失败吗?

我们在这里没有任何真正的选择……是吗?

UPDATE2:这里有一些有趣的东西,我们测试过的一些 ftps 似乎会在传输开始后自动分配空间。

例如,如果我将一个 200mb 的文件传输到 ftp 服务器。如果我连接到 ftp 服务器并在上传时进行大小调整,则传输处于活动状态。它显示大小为 200mb。即使文件只完成了 10%。

权限似乎也是随机设置的,IIS 附带的 FTP 服务器在文件复制完成后设置权限。而其他一些较旧的 ftp 服务器会在您发送文件时立即设置它。

:'(

4

4 回答 4

5
于 2008-12-17T19:49:01.270 回答
0

您无法知道操作系统副本何时完成。它可能会放慢速度或等待。

为了绝对确定,您确实需要两个文件。

  • 海量文件。
  • 还有一个很小的触发文件。

他们可以随心所欲地处理大量文件。但是当他们触摸触发文件时,您正在下载两者。


如果您无法获得触发器,则必须平衡轮询所需的时间与下载所需的时间。

做这个。

  1. 获取列表。检查时间戳。

  2. 检查大小与以前的文件大小。如果大小甚至不接近,则现在正在复制它。等待; 循环这一步,直到大小接近以前的大小。

  3. 虽然你还没有完成:

    一种。获取文件。

    湾。再次获取列表。检查新列表、先前列表和您的文件的大小。如果他们同意:你就完成了。如果他们不同意:下载时文件已更改;你还没有完成。

于 2008-12-17T19:03:45.930 回答
0

正如您所说,您对服务器的控制为 0,并且无法按照 S. Lott 的建议让您的客户发布触发文件,您必须处理不完善的解决方案并冒着文件传输不完整的风险,可能需要等待一段时间并比较文件大小之前和之后。

您可以尝试按照您的建议重命名,但由于您拥有 0 控制权,您无法确定 ftp-server-administrator(或其继任者)不会更改平台或 ftp 服务器或限制您的权限。

对不起。

于 2008-12-17T19:19:30.253 回答
0

如果您正在处理多个文件,您可以一次获取所有大小的列表,等待十秒钟,看看哪些是相同的。无论哪个仍然相同,都应该可以安全下载。

于 2008-12-17T19:23:06.000 回答