使用Python判断从FTP源接收文件是否已完全接收

5
我正在使用Python开发一个应用程序,它可以执行以下操作:
监控特定目录并等待文件传输。一旦文件传输完成,运行一些外部程序对该文件进行处理。
我在开发这个应用程序时遇到的主要问题是如何确定文件何时传输完成。据我所知,文件将通过SFTP传输到特定目录。Python如何知道文件何时传输完成?我知道可以使用os.stat(fileName)方法返回的对象的st_size属性。还需要使用其他工具来实现这些目标吗?

你知道最终文件大小会是多少吗?如果不知道,那么 st_size 并不能提供太多帮助,你唯一能做的就是使用 lsof,这是一个特定平台的库,它公开了 lsof 使用的功能,或者使用一个特定平台的文件系统监视器库。 - abarnert
1
请查看看门狗 - shawnzhu
根据平台的不同,您也可以使用pyinotify - Paulo Almeida
我不会知道正在传输的文件大小,并且我刚刚确认SFTP服务器是Windows机器。 - FearlessFuture
由于我将使用Windows机器,是否有任何Windows API调用可以与Python for Windows(http://sourceforge.net/projects/pywin32/)一起使用,以确定文件是否已完全传输。文件是否具有特殊的EOF标记,以显示它们已完成,Windows可以验证? - FearlessFuture
2个回答

6
我最终使用了 watchdog 和等待,直到我可以打开文件进行写入。
 #If there is no error when trying to read the file, then it has completely loaded
    try:
        with io.FileIO(fileName, "r+") as fileObj:

            '''
            Deal with case where FTP client uses extensions such as ".part" and '.filepart" for part of the incomplete downloaded file.
            To do this, make sure file exists before adding it to list of completedFiles.
            '''
            if(os.path.isfile(fileName)):
                completedFiles.append(fileName)
                print "File=" + fileName + " has completely loaded."
    except IOError as ioe:
        print str(ioe)

4

最佳解决方法是使用 SFTP 将文件发送到一个暂存区,然后使用 mv 命令(可能需要使用 SSH)将文件从暂存区移动到最终目标区域。然后,当文件出现在目标区域时,您的脚本就知道它已经完全传输了。


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