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
运行步骤:
- 将上述代码保存为
monitor.py; - 在终端执行
python monitor.py,程序会自动创建watch_folder和backup_folder两个目录; - 保持程序运行,在
watch_folder目录中新建任意文件(如test.txt); - 观察终端输出,应显示
[备份成功] test.txt -> ./backup_folder/test.txt; - 打开
backup_folder目录,确认文件已存在且内容一致。
判定标准:在监控目录中创建新文件后,备份目录中自动出现同名文件,且终端打印备份成功信息,即视为功能通过。若创建的是子文件夹,程序不会触发备份(符合预期设计)。
关键说明
recursive=False表示仅监控当前目录,不递归子文件夹;如需监控子目录可改为True。- 程序使用
shutil.copy2保留文件元数据(修改时间等)。 - 若备份目录中已存在同名文件,
copy2会直接覆盖,符合“自动备份最新文件”的预期。 - 停止监控时按
Ctrl+C,程序会安全关闭 Observer 线程。