Python 2.6
我的脚本需要监视ftp上的一些1G文件,当它被更改/修改时,脚本会将其下载到另一个地方。这些文件名将保持不变,人们将首先删除ftp上的原始文件,然后上传更新的版本。我的脚本将检查文件元数据,如文件大小和修改日期,以查看是否有任何差异。
问题是当脚本检查元数据时,新文件可能仍在上传。如何处理这种情况?是否有任何文件属性指示上传状态(如文件被锁定)?感谢。
答案 0 :(得分:4)
没有这样的属性。您可能无法获取此类文件,但这取决于服务器软件。此外,文件访问标志可以在文件上传时单向设置,然后在上传完成时更改;或者不完整的文件可能有修改过的名称(例如original_filename.ext.part) - 这完全取决于用于上传的服务器端软件。
如果您控制服务器,请创建自己的元数据,例如上传完成后,在新上传的文件旁边创建一个空标志文件。
在一般情况下,我担心,您可以做的最好的事情是监控文件大小,如果文件大小暂时没有变化,请考虑完全上传文件。使这个间隔足够大(大约几分钟)。
答案 1 :(得分:3)
你的问题遗漏了一些细节,但我会尽力回答。
1)根据您的操作系统,如果您正在使用Linux并且已经在内核中构建了inotify,则可以使用pyinotify来监视上传目录 - inotify可以区别于打开,修改,关闭事件并允许您异步监视文件系统事件,因此您不会不断轮询。 OSX和Windows都有相似但不同的实现设施。
2)您可以pythonically tail -f查看新文件何时放在服务器上(如果您甚至记录它),并在您看到相关更新消息时进行更新。
3)如果您的状态检查实用程序必须从FTP服务器在远程主机上运行,您必须轮询该文件的状态并构建一些逻辑以检测大小更改。您可以使用FTP“SIZE”命令来获得易于解析的字符串。
你必须在其中添加一些逻辑,这样如果文件大小变小,你就会认为它被替换了,然后等待它变大,直到它停止增长并在一段时间内保持相同的大小。如果存档的压缩方式可以验证总和,则可以下载,校验和,然后重新上载到远程站点。