2017-09-22 125 views
2

我遇到的问题是我看到的额外事件并不是我期待的。创建文件夹时用Python看门狗库查看多个事件

我在看文件夹C:\Users\kvasko\Downloads\data。如果我复制一个文件夹2017\07\25\LogFile.xml,我会看到以下3个“已创建”事件,但我希望只看到1.如果我提前创建日期文件夹结构(但是应用程序运行时正在监视文件夹),它只会生成像我期待的一样事件。我从来没有得到一个文件夹创建的事件。这就像创建文件夹所产生的事件一样,但当检查我的on_created(self,event)上的实际事件消息时,所有三个外观事件看起来完全相同。这里发生了什么?

这里是示例输出和最小示例。

2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 

我希望:

2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml 

有没有一种方式,如果其从文件夹创建实际的多个事件来检测?

以下是我的观察者配置。

folder = "C:\\Users\\kvasko\\Downloads\\data" 
observer = Observer(MyProcessHandler(patterns=["*.xml"]), folder, recursive=True) 
observer.start_observer() 

os.mkdirs("C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25") 
shutil.copy2("C:\temp\LogFile.xml", "C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25") 

try: 
    while True: 
     time.sleep(5) 
except: 
    print("Error") 

以下是我的处理程序类。

import logging 
from watchdog.events import PatternMatchingEventHandler 

class MyProcessHandler(PatternMatchingEventHandler): 

def on_created(self, event): 
    logging.info("Watchdog: file created " + str(event.src_path)) 

编辑:

这里是一个最小工作示例:

import time 
import os 
import shutil 
import datetime 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 

class TestEventHandler(PatternMatchingEventHandler): 
    def on_created(self, event): 
     print (str(datetime.datetime.now()) + " " + str(event)) 

if __name__ == '__main__': 
    path = "C:\\Temp" 
    event_handler = TestEventHandler(patterns=["*.xml"]) 
    observer = Observer() 
    observer.schedule(event_handler, path, recursive=True) 
    observer.start() 

    os.makedirs("C:\\Temp\\2017\\07\\25") 
    shutil.copy2("C:\\Temp2\\2017\\07\\25\\test.xml", "C:\\Temp\\2017\\07\\25") 

    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 
    observer.join() 

打印出:

2017-09-22 15:49:51.334262 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-22 15:49:52.335468 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-22 15:49:53.340998 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 

EDIT2:

变化on_created()来on_any_event( )。这是产生的。

2017-09-23 13:14:57.288792 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:58.291327 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:59.293334 <FileCreatedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
2017-09-23 13:14:59.293334 <FileModifiedEvent: src_path='C:\\Temp\\2017\\07\\25\\test.xml'> 
+0

不你的“LogFile.xml”的副本故事更多的两秒? –

+0

@LaurentLAPORTE不,这些文件就像100KB一样。 –

+0

@KevinVasko:如果您修改您的代码以使其成为可运行的示例,那对我们将会非常有帮助。 – unutbu

回答

1

您可能正在体验this bug。作为一种变通方法,您可以使用TestEventHandler类记录的最后一个文件路径中创建,而不是除非路径比去年生成的路径,或者如果该路径已被删除不同的应对后续on_created事件 :

import time 
import os 
import shutil 
import datetime 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 

class TestEventHandler(PatternMatchingEventHandler): 
    def __init__(self, *args, **kwargs): 
     super(TestEventHandler, self).__init__(*args, **kwargs) 
     self.last_created = None 
    def on_created(self, event): 
     path = event.src_path   
     if path != self.last_created: 
      print(str(datetime.datetime.now()) + " " + str(event)) 
      self.last_created = path 
    def on_deleted(self, event): 
     path = event.src_path 
     if path == self.last_created: 
      self.last_created = None 

if __name__ == '__main__': 

    path = "C:\\Temp" 
    target_dir = "C:\\Temp\\2017\\07\\25" 
    src_dir = "C:\\Temp2\\2017\\07\\25" 
    filename = 'test.xml' 

    target = os.path.join(target_dir, filename) 
    src = os.path.join(src_dir, filename) 

    event_handler = TestEventHandler(patterns=["*.xml"]) 
    observer = Observer() 
    observer.schedule(event_handler, path, recursive=True) 
    observer.start() 

    if not os.path.exists(target_dir): 
     os.makedirs(target_dir) 

    if os.path.exists(target): 
     os.unlink(target) 

    for i in range(3): 
     shutil.copy2(src, target_dir)  

    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 
    observer.join() 
+0

这看起来是问题,你的解决方法完美的工作!万分感谢。我将您的解决方案标记为答案。 –