我打算使用ftplib来监控服务器上的新文件。有没有办法查看是否仍在传输新文件?
以下是查找新文件的部分解决方案:
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()
答案 0 :(得分:1)
我假设您想知道是否可以通过不同的 FTP连接确定文件是否正在传输。通常,这是不可能的,因为没有FTP命令询问是否正在进行文件传输。
您可以依赖于通过FTP.size
轮询非标准SIZE
命令的启发式方法来查看文件的大小是否随着时间的推移而增长,然后假设它保持相同的大小文件未进行的持续时间。
请注意,此启发式操作可能会导致您检测到文件未在进行中,即使它仍在进行中,因此您需要确保您可以正常使用处理部分截断的文件。
请记住,FTP连接有时会断开连接并在以后恢复,因此如果发生这种情况,您可能不得不依赖非常大的时间刻度来检测文件何时完成,除非您确定有多大该文件应该是。
如果您可以控制您的客户,您可以要求您的客户在您的文件上传旁边放置一些其他元文件,告诉您正在监控的文件的预期大小,然后您可以确定文件何时完成只需检查文件大小即可上传。同样,您可以使用MD5或其他外部文件有效性检查。另一种方法可能依赖于文件本身是自我描述的,包括内部完整性检查或文件长度。许多标准文件格式都包含这样的标题。