使用ftplib监视FTP服务器的新文件时,有没有办法查看是否仍在传输新文件?

时间:2016-02-10 23:08:05

标签: python ftp ftplib

我打算使用ftplib来监控服务器上的新文件。有没有办法查看是否仍在传输新文件?

以下是查找新文件的部分解决方案:

Monitor remote FTP directory

from ftplib import FTP
from time import sleep

ftp = FTP('localhost')
ftp.login()

def changemon(dir='./'):
    ls_prev = set()

    while True:
        ls = set(ftp.nlst(dir))

        add, rem = ls-ls_prev, ls_prev-ls
        if add or rem: yield add, rem

        ls_prev = ls
        sleep(5)

for add, rem in changemon():
    print('\n'.join('+ %s' % i for i in add))
    print('\n'.join('- %s' % i for i in remove))

ftp.quit()

1 个答案:

答案 0 :(得分:1)

我假设您想知道是否可以通过不同的 FTP连接确定文件是否正在传输。通常,这是不可能的,因为没有FTP命令询问是否正在进行文件传输。

您可以依赖于通过FTP.size轮询非标准SIZE命令的启发式方法来查看文件的大小是否随着时间的推移而增长,然后假设它保持相同的大小文件未进行的持续时间。

请注意,此启发式操作可能会导致您检测到文件未在进行中,即使它仍在进行中,因此您需要确保您可以正常使用处理部分截断的文件。

请记住,FTP连接有时会断开连接并在以后恢复,因此如果发生这种情况,您可能不得不依赖非常大的时间刻度来检测文件何时完成,除非您确定有多大该文件应该是。

如果您可以控制您的客户,您可以要求您的客户在您的文件上传旁边放置一些其他元文件,告诉您正在监控的文件的预期大小,然后您可以确定文件何时完成只需检查文件大小即可上传。同样,您可以使用MD5或其他外部文件有效性检查。另一种方法可能依赖于文件本身是自我描述的,包括内部完整性检查或文件长度。许多标准文件格式都包含这样的标题。