Python(看门狗) - 等待正确创建文件

时间:2014-03-01 18:10:18

标签: python watchdog

我是Python的新手,我正在尝试实现一个好的“文件创建”检测。如果我没有放time.sleep(x)我的文件以错误的方式详细阐述,因为它们仍在文件夹中“创建”。 (缓冲区不为空) 每次创建文件时,如何在不等待x秒的情况下绕过这个事情?

这是我的代码:

主:

while 1:
    if len(parser()) > 0: #  arguments are valid
        if len(parser()) == 3:
            log_path = parser()['log_path']
        else:
            log_path = os.getcwd()
        paths = parser()
        if paths:
            handler = Event_Handler()
            observer = Observer()
            observer.schedule(handler, paths['src_fld'], True)
            observer.start()
            try:
                    while True:
                        time.sleep(1)
            except KeyboardInterrupt:
                observer.stop()
            observer.join()
    else:
        exit(1)

Event_Handler类:

class Event_Handler(FileSystemEventHandler):
    def on_created(self, event):
        if not event.is_directory:
            time.sleep(1)

正如我所说,没有time.sleep(1),如果我尝试处理一个大文件,我会失败,因为它仍然没有写完。

2 个答案:

答案 0 :(得分:2)

为了将来偶然发现这个问题的读者,答案似乎是你做不到的。看门狗没有也不会支持任何功能来判断文件是否“完整”,因为Windows不允许它,而看门狗是系统无关的。

如果您使用的是Linux或某些发行版,那么inotify可能是一个安全的选择。否则,在Windows上,我发现的最佳解决方案是:

上传一个大文件,bigfile,然后另一个文件,bigfile-complete。当您找到文件 name -complete时,您将返回并上传/传输/响应原始文件 name 。在这种情况下,您的文件将全部添加到 file file -complete, file2 的队列中的受监控目录中file2 - 完成,。 。

轮询文件大小,直到它保持固定一段合适的时间。当它没有经过足够长的变化而你可以合理地确定它已经完成时,就会正常反应。

类似地,当文件以零碎的方式上传到您的目录时,它将生成文件修改的Watchdog事件的恒定流。您可以轮询这些而不是文件大小,等待它们停止一段合理的时间,然后假定文件已完成并继续。

这些解决方案都不是完美的,但这似乎是Windows上Watchdog的固有问题。不幸的是,“完美”的解决方案似乎是“交换到Linux并使用inotify”。

答案 1 :(得分:0)

尝试在while循环中读取文件:

def on_created(event):

    ...

    # WAITING FOR FILE TRANSFER
    file = None
    while file is None:
        try:
            file = open(event.src_path)
        except OSError:
            file = None
            print("WAITING FOR FILE TRANSFER....")
            time.sleep(3)
            continue