2014-03-01 51 views
1

我是Python的新手,我试图实现一个很好的“文件创建”检测。如果我不把time.sleep(x)我的文件以错误的方式阐述,因为它们仍在文件夹中“创建”。 (缓冲区不为空) 每次创建文件时,我怎样才能绕过此事而不用等待x秒?Python(看门狗) - 等待文件被正确创建

这是我的代码:

主营:

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)如果我尝试处理大文件,我会因为它还没有完全写入而失败。

+0

它是没有办法的。使用这个http://pyinotify.sourceforge.net/ –

+1

看门狗是跨平台的,所以它更适合。 – peperunas

+0

没有'close_written'事件? – zx1986

回答

1

为了未来读者如果偶然发现这个问题,就像我一样,答案似乎是你不能。看门狗不会支持任何功能来告诉文件是否“完整”,因为Windows不允许它,并且看门狗是与系统无关的。

如果你在Linux或其他发行版上,inotify可能是一个安全的选择。否则,在Windows上,我找到的最佳解决方案是:

上传一个大文件,bigfile,然后是另一个文件bigfile-complete。当你找到一个文件名称 -complete,你回去上传/传输/反应到原始文件名称。在这种情况下,您的文件都会被添加到监控目录在队列中去文件文件 -complete,文件2文件2 -complete。 。 。

轮询文件大小,直到它保持固定一段合适的时间。当它没有改变的时间足够长,以至于你可以合理地确定它已经完成时,就像平常那样对它做出反应。

同样,当一个文件被上传到你的目录中时,它会产生一个持续的文件修改的看门狗事件流。您可以轮询这些文件而不是文件大小,等待它们停止一段合理的时间,然后假定文件已完成并继续。

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

0

使用patterns变量PatternMatchingEventHandler,而不是使用经过时间作为指标,最简洁的解决方案将只监视某些类型的文件。

只需将'.temp'附加到您上传/编写的每个文件,并在完成后将其重命名为其真实姓名。

设置patterns寻找'*.temp'文件,并监测其重命名到任何类型的文件,你的愿望使用FileSystemMovedEvent事件(及其相关Handler.on_moved()法)及其dest_path价值,这将包括文件的新名称,现在完全写了。