2

我有一个脚本来扫描目录以查看何时添加新文件,然后处理它们的内容。它们是视频文件,因此它们通常非常大,并且通过网络传输并且通常需要很长时间才能传输。所以我需要确保他们在继续之前完成了复制。

目前,一旦我在目录中找到了一个新文件,我就使用 os.path.mtime 检查修改日期,并将其与上次扫描文件的时间进行比较,看看它是否仍在修改中. 理论是,如果它不再被修改,那么它应该已经完成​​转移。

if getmtime(path.join(self.rootFolder, thefile)) < self.lastchecktime: newfiles.append[thefile]

但这似乎不起作用 - 脚本过早触发并且处理失败,因为文件未完全加载。会不会是扫描之间没有足够的停顿以使 mtime 保持不变……?我在两次扫描之间给它 10 秒 - 这应该足够了,当然。

有没有一种简单/更pythonic的方式来做到这一点?这些文件位于在 VM 上运行的 Windows 服务器上。

4

2 回答 2

1

您对文件的添加有任何控制权吗?如果是这样,您可以创建一个名称类似于videoname-complete视频上传完成后的空文件,并注意这些文件。

于 2012-12-21T01:19:44.137 回答
1

您的检查不会是“我的修改时间是否大于上次检查的时间?”。

if os.path.getmtime(path) > self.lastAccessedTime: 
    # do something as modified time is greater than last time I checked
    pass 

我不是 Windows 人,但我相信会有一些等效的库来为 Windows 进行 inotify。这是在文件系统级别侦听文件或目录更改的一种非常好的方法。我要留下一些在 linux 上使用 pyinotify 工作的示例代码,这对使用 linux 的人会有所帮助。

class PTmp(pyinotify.ProcessEvent):
    def process_IN_CLOSE_WRITE(self, event):
        print "Changed: %s " % os.path.join(event.path, event.name)


wm = pyinotify.WatchManager()
mask = pyinotify.IN_CLOSE_WRITE
notifier = pyinotify.Notifier(wm, PTmp())
wdd = wm.add_watch(FILE_LOCATION, mask, rec=True)

while True:
    try:
        notifier.process_events()
        if notifier.check_events():
            notifier.read_events()

    except KeyboardInterrupt:
        notifier.stop()
        break
于 2012-12-21T01:22:00.270 回答