4. 监控文件夹变化

任务说明

监控指定文件夹,当检测到新文件创建时,自动将该文件复制到备份目录。本案例使用 watchdog 库实现文件系统事件监听,核心逻辑为:监听文件夹的 on_created 事件,触发后执行备份函数。

实现代码

import os
import shutil
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# ========== 配置 ==========
WATCH_DIR = "./watch_folder"        # 被监控的文件夹
BACKUP_DIR = "./backup_folder"      # 备份目标文件夹
# =========================

class BackupHandler(FileSystemEventHandler):
    """当有新文件创建时,自动备份到 BACKUP_DIR"""
    def on_created(self, event):
        # 只处理文件创建,不处理目录创建
        if event.is_directory:
            return
        src_path = event.src_path
        filename = os.path.basename(src_path)
        dst_path = os.path.join(BACKUP_DIR, filename)
        try:
            shutil.copy2(src_path, dst_path)
            print(f"[备份成功] {filename} -> {dst_path}")
        except Exception as e:
            print(f"[备份失败] {filename}: {e}")

def ensure_dirs():
    """确保监控目录和备份目录存在"""
    os.makedirs(WATCH_DIR, exist_ok=True)
    os.makedirs(BACKUP_DIR, exist_ok=True)

def main():
    ensure_dirs()
    event_handler = BackupHandler()
    observer = Observer()
    observer.schedule(event_handler, WATCH_DIR, recursive=False)
    observer.start()
    print(f"正在监控文件夹: {os.path.abspath(WATCH_DIR)}")
    print(f"备份目录: {os.path.abspath(BACKUP_DIR)}")
    print("按 Ctrl+C 停止监控...")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

if __name__ == "__main__":
    main()

运行与验证

依赖安装:

pip install watchdog

运行步骤:

  1. 将上述代码保存为 monitor.py;
  2. 在终端执行 python monitor.py,程序会自动创建 watch_folder 和 backup_folder 两个目录;
  3. 保持程序运行,在 watch_folder 目录中新建任意文件(如 test.txt);
  4. 观察终端输出,应显示 [备份成功] test.txt -> ./backup_folder/test.txt;
  5. 打开 backup_folder 目录,确认文件已存在且内容一致。

判定标准:在监控目录中创建新文件后,备份目录中自动出现同名文件,且终端打印备份成功信息,即视为功能通过。若创建的是子文件夹,程序不会触发备份(符合预期设计)。

watchdog 文件夹监控与自动备份流程 watch_folder 被监控目录 创建新文件 Observer 监听 on_created 事件 recursive=False 触发回调 BackupHandler on_created() shutil.copy2() 复制文件 backup_folder 备份目录(自动创建) 验证方式:在 watch_folder 中新建文件 → 观察终端输出 → 检查 backup_folder 中是否出现同名文件 判定标准:备份目录出现同名文件且终端打印 [备份成功] 即通过

关键说明

  • recursive=False 表示仅监控当前目录,不递归子文件夹;如需监控子目录可改为 True。
  • 程序使用 shutil.copy2 保留文件元数据(修改时间等)。
  • 若备份目录中已存在同名文件,copy2 会直接覆盖,符合“自动备份最新文件”的预期。
  • 停止监控时按 Ctrl+C,程序会安全关闭 Observer 线程。