防止ftplib在下载文件时中途停止?

4
我们设置了一个FTP系统来监视/下载不在我们控制下的远程FTP服务器。脚本连接到远程FTP,获取服务器上文件的文件名,然后检查它是否已经被下载。如果没有下载,则下载该文件并将其添加到列表中。
最近我们遇到了一个问题,远程FTP上的某个人会复制一个巨大的单个文件(>1GB),然后脚本会唤醒,看到一个新文件并开始下载正在复制的文件。
如何检查这个问题?我想获取文件大小,等待几秒钟,再次检查文件大小,看看它是否增加,如果没有增加,则下载它。但由于时间是关键,我们不能为每个文件集等待几秒钟,看看它的文件大小是否增加。
那么怎样才能最好地解决这个问题呢?目前所有操作都是通过Python的ftplib完成的,除了使用上述方法之外,我们还能做什么呢?
请注意,我们无法控制远程FTP站点。
更新1:
我在想,如果我尝试重命名它...既然我们在ftp上拥有完全权限,如果文件上传正在进行中,重命名命令会失败吗?
我们真的没有任何选择......对吗?
更新2:
好吧,这里有一些有趣的东西,我们测试的一些FTP似乎会自动分配空间一旦传输开始。
例如,如果我将一个200MB的文件传输到FTP服务器上。当传输正在进行时,如果我连接到FTP服务器并在上传过程中执行大小,则显示大小为200MB。即使文件只完成了大约10%。
权限似乎也是随机设置的,随着IIS一起提供的FTP服务器在文件完成复制后设置权限。而其他一些旧的FTP服务器则会在发送文件后立即设置权限。
:'(
4个回答

5

“该死的鱼雷!全速前进!”

只需下载文件。如果文件很大,则在下载完成后等待适当的时间,然后从停止的点继续下载。重复此过程,直到没有更多要下载的内容。


这绝不是一个坏方法。我喜欢它。 - UberJumper

0

你无法知道操作系统的复制何时完成。它可能会变慢或等待。

为了绝对确定,你真的需要两个文件。

  • 大文件。
  • 和一个微小的触发器文件。

他们可以随意更改大文件。但是当他们触碰到触发器文件时,你就会下载两个文件。


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

按照以下步骤操作。

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

  2. 检查文件大小与先前文件大小的差异。如果大小相差很大,那么文件正在被复制。等待;在此步骤上循环,直到大小接近先前大小。

  3. 当您还没有完成时:

    a. 获取文件。

    b. 再次获取列表。检查新列表、旧列表和您的文件的大小。如果它们一致: 您完成了。如果它们不一致: 在您下载时文件已更改; 您尚未完成。


0

如你所说,你对服务器没有任何控制权,并且不能像S. Lott建议的那样让客户端发布触发文件,因此你必须处理不完美的解决方案并冒着文件传输不完整的风险,也许需要等待一段时间并在上传前后比较文件大小。

你可以尝试按照你的建议进行重命名,但由于你没有任何控制权,无法确定ftp服务器管理员(或其继任者)是否更改平台或ftp服务器或限制你的权限。

很抱歉。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接