【问题标题】:Python: Check for new files and wait until they have finished transferringPython:检查新文件并等待它们完成传输
【发布时间】:2012-12-21 00:47:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python video filesystems windows-server-2008


    【解决方案1】:

    您对文件的添加有任何控制权吗?如果是这样,您可以在视频上传完成后创建一个名称为 videoname-complete 的空文件,然后查看这些文件。

    【讨论】:

    • 虽然不是“纯粹的”,也不是最好的解决方案,但这经常在实践中使用(基于我对企业集成系统的经验)。这有点笨拙,但确实有效。 +1
    【解决方案2】:

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

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

    我不是 windows 专家,但我相信会有一些等效的库来为 windows 进行 inotify。这是在文件系统级别侦听文件或目录更改的一种非常好的方法。我留下了一些使用 pyinotify 在 linux 上工作的示例代码,这对 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
    

    【讨论】:

    • 不,如果修改时间大于我上次检查的时间,那么文件在此期间发生了一些事情,它仍然可以加载。查找新文件有效,只是查找已完成更改的新文件才是问题所在。我已经更新了问题
    • 抱歉,您要检查文件是否已完成上传?
    • 是的,因此标题中的“等到他们完成传输”。
    • 我认为这需要操作系统的某种支持才能使其可靠。在 linux 中,您可以使用一些方便的实用程序,例如 lsof 来检查文件是否被另一个进程打开。因此,您可以检查修改时间以及检查文件是否仍然打开。
    • 感谢 inotify 的建议。我认为我需要更加努力地为此获得一个 linux / os X 服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2011-03-08
    • 2013-10-23
    相关资源
    最近更新 更多