Python 检查文件状态是否正在上传
Python 2.6
我的脚本需要监控一些1G大小的文件,这些文件在ftp上。当文件被修改或更改时,脚本会把它下载到另一个地方。这些文件的名字不会变,人们会先删除ftp上的原文件,然后再上传一个新版本。我的脚本会检查文件的一些信息,比如文件大小和最后修改日期,来判断是否有变化。
问题是,当脚本在检查这些文件信息时,新文件可能还在上传中。那我该怎么处理这种情况呢?有没有什么文件属性可以表示文件正在上传的状态(比如文件被锁定)?谢谢。
2 个回答
你的问题缺少了一些细节,不过我会尽量回答。
- 如果你在同一台服务器上运行状态检查程序和FTP:
1) 根据你的操作系统,如果你使用的是Linux,并且在内核中集成了inotify,你可以使用pyinotify来监视你的上传目录——inotify可以区分打开、修改和关闭等事件,让你可以异步地监控文件系统事件,这样就不需要一直去检查。OSX和Windows也有类似的功能,只是实现方式不同。
2) 你可以用Python的方式tail -f来查看服务器上何时有新文件被上传(如果你有记录的话),然后在看到相关的更新信息时进行更新。
- 如果你在远程运行程序
3) 如果你的状态检查工具必须在与FTP服务器不同的远程主机上运行,你就需要定期检查文件的状态,并加入一些逻辑来检测文件大小的变化。你可以使用FTP的'SIZE'命令来获取一个易于解析的字符串。
你需要加入一些逻辑,比如如果文件大小变小,就假设它正在被替换,然后等待文件大小变大,直到它停止增长并保持一段时间不变。如果这个压缩文件的方式可以验证其和,你就可以下载它,进行校验和检查,然后再上传到远程站点。
这个属性是不存在的。你可能无法获取这样的文件,但这取决于服务器的软件。此外,文件的访问权限在上传时可能是一种设置,上传完成后又会改变;或者未完成的文件可能会有修改过的名字(比如原文件名.ext.part)——这一切都取决于用于上传的服务器端软件。
如果你能控制服务器,可以自己创建一些元数据,比如在上传完成时,和新上传的文件一起创建一个空的标志文件。
一般来说,我担心你能做的最好的办法就是监控文件的大小,如果文件的大小在一段时间内没有变化,就可以认为文件已经完全上传。这个时间间隔要设置得足够长(大约几分钟)。