2017-09-22 81 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

這看起來是問題,你的解決方法完美的工作!萬分感謝。我將您的解決方案標記爲答案。 –