# watchdog==6.0.0
import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, FileCreatedEvent, FileModifiedEvent, FileDeletedEvent, FileMovedEvent
from watchdog.observers.polling import PollingObserver


class FileChangeHandler(FileSystemEventHandler):
    """文件变化事件处理器,继承自watchdog的事件处理器基类"""

    def on_created(self, event: FileCreatedEvent):
        """文件创建事件处理"""
        if not event.is_directory:
            print(f"[新建] 文件: {event.src_path}")
        else:
            print(f"[新建] 目录: {event.src_path}")

    def on_modified(self, event: FileModifiedEvent):
        """文件修改事件处理"""
        if not event.is_directory:
            print(f"[修改] 文件: {event.src_path}")
        else:
            print(f"[修改] 目录: {event.src_path}")

    def on_deleted(self, event: FileDeletedEvent):
        """文件删除事件处理"""
        if not event.is_directory:
            print(f"[删除] 文件: {event.src_path}")
        else:
            print(f"[删除] 目录: {event.src_path}")

    def on_moved(self, event: FileMovedEvent):
        """文件移动/重命名事件处理"""
        if not event.is_directory:
            print(f"[移动] 文件: {event.src_path}{event.dest_path}")
        else:
            print(f"[移动] 目录: {event.src_path}{event.dest_path}")


def start_watching(directory: str, recursive: bool = True):
    """
    启动文件系统监控

    参数:
        directory: 要监控的目录路径
        recursive: 是否递归监控子目录,默认为True
    """
    # 确保目录存在
    if not os.path.exists(directory):
        raise ValueError(f"监控目录不存在: {directory}")

    # 创建事件处理器和观察者
    event_handler = FileChangeHandler()
    observer = PollingObserver(timeout=2)  #Observer()  两种方式

    # 调度监控任务
    observer.schedule(
        event_handler,
        path=directory,
        recursive=recursive
    )

    # 启动监控
    observer.start()
    print(f"开始监控目录: {directory}")
    print("按 Ctrl+C 停止监控...")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        # 优雅地停止监控
        observer.stop()
        print("\n监控已停止")

    # 等待监控线程结束
    observer.join()


if __name__ == "__main__":
    # 要监控的目录路径,修改为你需要监控的目录
    MONITOR_DIR = r"D:\jiexun\detection\yolo"

    # 启动监控
    try:
        start_watching(MONITOR_DIR)
    except Exception as e:
        print(f"监控失败: {e}")

在这里插入图片描述
选择 Observer 还是 PollingObserver 主要取决于文件系统类型和实时性需求。默认实现适合大多数本地场景,而轮询方式则是网络环境和特殊文件系统的必备方案。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐