功能说明:

这个 Python 程序是一个自动化文件同步工具,能够将一个源文件夹的文件实时同步到目标文件夹,保持两个文件夹中的文件一致。它支持递归复制子文件夹,并且能够自动检测文件的变化(如文件的新增、修改或删除),并做出相应的同步操作。该工具适用于需要保持文件夹之间数据一致性的场景,例如备份文件夹、开发环境同步等。

程序功能的亮点包括:

  • 实时监控源文件夹的变化。
  • 自动将源文件夹的变化同步到目标文件夹。
  • 支持递归文件夹结构。
  • 支持文件的增量同步(仅同步新增或修改的文件)。
  • 支持文件删除同步(如果源文件夹删除了某个文件,目标文件夹中的相应文件也会被删除)。
  • 支持日志记录同步过程。
  • 提供配置选项,允许用户自定义同步间隔、文件夹路径等。

代码:

import os
import shutil
import time
import logging
from filecmp import dircmp

# 配置日志
logging.basicConfig(filename='sync.log', level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')

# 配置常量
SOURCE_DIR = "source"          # 需要同步的源文件夹路径
TARGET_DIR = "target"          # 目标文件夹路径
SYNC_INTERVAL = 10             # 同步间隔,单位为秒,默认为10秒

# 获取当前时间,用于创建日志条目
def get_current_time():
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

# 判断两个文件夹的内容是否相同
def compare_directories(source, target):
    # 使用 dircmp 对比源文件夹和目标文件夹
    dcmp = dircmp(source, target)
    return dcmp.left_only, dcmp.right_only, dcmp.diff_files

# 同步文件夹内容
def sync_folders(source, target):
    # 比较源文件夹和目标文件夹
    left_only, right_only, diff_files = compare_directories(source, target)
    
    # 同步新增或修改的文件
    for file in left_only + diff_files:
        source_file = os.path.join(source, file)
        target_file = os.path.join(target, file)
        if os.path.isdir(source_file):
            # 如果是目录,则递归调用
            if not os.path.exists(target_file):
                os.makedirs(target_file)
                logging.info(f"{get_current_time()} - 创建目录: {target_file}")
            sync_folders(source_file, target_file)
        else:
            # 如果是文件,则复制文件
            shutil.copy2(source_file, target_file)
            logging.info(f"{get_current_time()} - 同步文件: {source_file} 到 {target_file}")
    
    # 同步目标文件夹中已删除的文件
    for file in right_only:
        target_file = os.path.join(target, file)
        if os.path.isdir(target_file):
            shutil.rmtree(target_file)
            logging.info(f"{get_current_time()} - 删除目录: {target_file}")
        else:
            os.remove(target_file)
            logging.info(f"{get_current_time()} - 删除文件: {target_file}")

# 执行同步操作
def perform_sync():
    if not os.path.exists(SOURCE_DIR):
        logging.error(f"{get_current_time()} - 错误: 源文件夹 {SOURCE_DIR} 不存在!")
        return

    if not os.path.exists(TARGET_DIR):
        os.makedirs(TARGET_DIR)
        logging.info(f"{get_current_time()} - 创建目标文件夹: {TARGET_DIR}")

    # 开始同步
    sync_folders(SOURCE_DIR, TARGET_DIR)

# 定时同步
def scheduled_sync():
    logging.info(f"{get_current_time()} - 自动同步程序启动...")
    while True:
        perform_sync()  # 执行同步
        logging.info(f"{get_current_time()} - 等待 {SYNC_INTERVAL} 秒后进行下一次同步...")
        time.sleep(SYNC_INTERVAL)  # 等待指定的时间间隔后再进行下一次同步

# 主程序
def main():
    scheduled_sync()

# 执行主程序
if __name__ == "__main__":
    main()

使用说明:

  1. 安装要求:

    • Python 3.x 环境。
    • 程序使用了 Python 内置的 osshutiltimeloggingfilecmp 模块,无需安装额外的第三方库。
  2. 程序运行:

    • 将代码保存为 auto_sync.py
    • 在终端(命令行)中运行该程序:

      python auto_sync.py
  3. 配置项说明:

    • SOURCE_DIR:需要同步的源文件夹路径。例如 source 目录。
    • TARGET_DIR:目标文件夹路径,所有源文件夹中的变化都会同步到此目录。
    • SYNC_INTERVAL:指定同步的时间间隔,单位为秒。默认值为 10 秒,即每 10 秒同步一次。您可以根据需要调整此值。
  4. 运行效果:

    • 程序会定期监控 SOURCE_DIR 目录中的文件变化,并将其同步到 TARGET_DIR。每次检测到源文件夹有新增、修改或删除的文件,程序会自动执行同步操作。
    • 文件的增量同步:仅会同步新增或修改过的文件。
    • 删除同步:如果源文件夹中删除了某个文件或文件夹,目标文件夹中的相应文件也会被删除。
    • 程序会记录所有同步操作的日志,日志文件保存在 sync.log 中。
  5. 日志文件:

    • 程序会将每次同步的结果记录在 sync.log 文件中,包括文件和文件夹的同步、删除操作。日志格式如下:

      2025-04-15 13:30:00 - 同步文件: source/file1.txt 到 target/file1.txt
      2025-04-15 13:30:10 - 删除文件: target/file2.txt
      2025-04-15 13:30:20 - 创建目录: target/new_directory
  6. 如何停止程序:

    • 如果您希望停止同步操作,可以通过终端中的 Ctrl + C 来中断程序执行。
  7. 同步过程解释:

    • 程序通过 filecmp.dircmp 比较源文件夹和目标文件夹的内容,找出差异。
    • 任何新增或修改的文件将被同步到目标文件夹。
    • 任何在源文件夹中被删除的文件或文件夹将在目标文件夹中被删除。
    • 程序会定期检查源文件夹,并在有变化时自动执行同步操作。
  8. 扩展功能:

    • 增量同步:目前程序仅支持基于时间差异的同步,后续可以扩展为仅同步被修改过的文件,进一步减少同步的文件数量。
    • 同步过滤:可以根据文件类型(例如 .txt.jpg)来过滤不需要同步的文件。
    • 邮件通知:在同步操作完成后,可以发送邮件通知用户同步的状态。

小结:

这个自动化文件同步工具使用 Python 编写,能够帮助用户保持两个文件夹的内容一致。它可以实时监控源文件夹的变化,并将增量变化同步到目标文件夹中。程序还支持删除文件同步,确保源和目标文件夹中的文件完全一致。通过日志记录和自定义配置,用户可以方便地进行文件夹同步,并跟踪同步过程中的所有操作。


1 声望2 粉丝