下面是我的看门狗脚本。在Vim中修改文件时,将触发删除然后创建的事件。 This is expected.
这会导致问题。我希望它忽略通过Vim进行文件修改时的删除事件,并运行修改后的功能,但是在实际删除文件时运行删除后的功能。
是否可以不更改我的Vim配置?
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
WATCH_PATH = './files'
class Handler(FileSystemEventHandler):
def on_any_event(self, event):
if event == 'modified':
modified(event.src_path)
if event == 'created':
created(event.src_path)
if event == 'deleted':
deleted(event.src_path)
def modified(src):
print(src, 'modified')
def created(src):
print(src, 'created')
def deleted(src):
print(src, 'deleted')
if __name__ == "__main__":
eh = Handler()
observer = Observer()
observer.schedule(eh, path=WATCH_PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
为了更好地理解问题,我对您的代码做了一些修改。
...
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
...
if __name__ == "__main__":
# eh = Handler()
eh = LoggingEventHandler()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
observer = Observer()
...
FileSystemEventHandler
功能中的LoggingEventHandler
替换为main
,它将生成事件日志。在修改目录“ ./file”中的文本文件时,生成的日志如下:
2020-04-26 12:41:25 - Created file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
2020-04-26 12:41:25 - Modified file: ./files/b.txt~
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Deleted file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
这里已删除的文件是b.txt~
,它是中间文件,而不是原始文件。因此,您只需要过滤掉中间文件的事件即可。
这里是修正的代码:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
WATCH_PATH = './files'
class Handler(FileSystemEventHandler):
def on_any_event(self, event):
if str(event.src_path).endswith("~"):
return None
if event.event_type == 'modified':
modified(event.src_path)
elif event.event_type == 'created':
created(event.src_path)
elif event.event_type == 'deleted':
deleted(event.src_path)
def modified(src):
print(src, 'modified')
def created(src):
print(src, 'created')
def deleted(src):
print(src, 'deleted')
if __name__ == "__main__":
eh = Handler()
observer = Observer()
observer.schedule(eh, path=WATCH_PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopping the observer...")
observer.stop()
observer.join()
输出:
./files modified
./files/b.txt modified
./files modified