EverySync 是一个结合 Everything API 实现快速文件比对和备份的工具,支持增量备份和完整备份。
- 支持多个驱动器和目录的备份
- 支持增量备份和完整备份
- 详细的日志记录
- 灵活的文件排除规则配置
- 实时显示备份进度
- 自动处理路径过长问题
- 集成 Everything 搜索工具,快速定位需要备份的文件
- 智能的线程池管理,自动适应系统资源
- 从 config.json 加载配置信息
- 从 ignore.txt 加载排除规则
- 验证备份源和目标路径
- 检查驱动器可用性
- 优先使用 Everything SDK 获取文件列表
- 根据配置的增量备份天数筛选文件
- 应用 ignore.txt 中的排除规则
- 处理路径长度超过限制的文件
- 在 Everything 不可用时回退到文件系统遍历
- 对每个文件执行以下操作:
- 检查文件是否需要更新(比较大小和修改时间)
- 创建目标目录结构
- 复制文件
- 记录备份状态和日志
- 跳过无法访问的文件
- 记录错误信息
- 统计成功、失败和跳过的文件数
{
"backup": {
"sources": {
"D:\\SourcePath": "G:\\BackupPath", // 源路径: 目标路径
"E:": "G:\\E\\" // 支持驱动器根目录
},
"file_size_limit_mb": 100, // 文件大小限制(MB)
"incremental_days": 1, // 增量备份天数,0表示完整备份
"parallel": {
"enabled": true, // 是否启用并行处理
"max_workers": null, // 工作线程数,null表示自动设置
"small_file_size_mb": 10, // 小文件阈值(MB)
"batch_size": 100 // 小文件批处理数量
}
},
"log": {
"debug_log_path": "logs\\debug.log", // 调试日志路径
"run_log_path": "logs\\run.log", // 运行日志路径
"lost_log_path": "logs\\lost.log", // 丢失文件日志路径
"trace_enabled": false // 是否启用跟踪日志
}
}
# 系统文件和目录
$RECYCLE.BIN
System Volume Information
pagefile.sys
# 开发相关
.git
.svn
node_modules
# 临时文件
*.tmp
*.log
- 编辑 config.json 配置备份源和目标路径
- 编辑 ignore.txt 配置排除规则
- 运行 run.bat 或执行
python src/main.py
- 查看控制台输出和日志文件了解备份状态
- debug.log: 详细的调试信息
- run.log: 运行时的主要操作记录
- lost.log: 丢失文件的记录
- 首次运行建议进行完整备份(incremental_days = 0)
- 定期检查日志文件了解备份状态
- 路径长度超过240字符的文件将被跳过
- Python 3.7+
- Everything 搜索工具(可选,推荐安装)
- Windows 7/10/11
Everything 通过直接读取 NTFS 的 Master File Table (MFT) 来实现快速文件搜索。我们可以利用这一特性来优化文件扫描过程:
-
优化搜索查询:
- 使用 Everything 的高级搜索语法来快速定位需要备份的文件。
- 示例代码:
def get_files_from_everything(path: str, days: int = 7) -> List[dict]: everything = Everything() query = f'path:{path} dm:last{days}days' # 最近N天修改的文件 return everything.search(query)
-
高级搜索语法优化:
- 使用日期过滤:
dm:last7days
或dm:prev7days
或dm:past7days
(最近7天修改) - 使用大小过滤:
size:>100mb
- 使用路径过滤:
path:"D:\Project\" !path:".git\"
- 使用文件属性:
!attrib:S !attrib:H
(排除系统和隐藏文件) - 使用特定文件类型:
ext:txt
- 使用日期过滤:
-
实时监控文件变化:
- 利用 Everything 的 IPC 机制获取文件变更通知。
- 实时更新本地数据库,减少全盘扫描的需求。
为了避免每次都进行全盘扫描,可以建立一个本地数据库(如 SQLite)来存储文件信息:
-
数据库结构:
- 存储文件路径、大小、修改时间、MD5值、最后备份时间和最后检查时间。
- 示例 SQL 语句:
CREATE TABLE files ( path TEXT PRIMARY KEY, size INTEGER, modified_time INTEGER, md5 TEXT, last_backup_time INTEGER, last_check_time INTEGER );
- last_backup_time:
- 记录文件最后一次被成功备份的时间
- 用于增量备份时判断文件是否需要备份
- 当文件被成功备份后更新此时间戳
- last_check_time:
- 记录文件最后一次被检查(比对)的时间
- 用于优化文件比对过程,避免重复检查未变化的文件
- 即使文件没有被备份,只要进行了比对,就会更新此时间戳
-
增量更新策略:
- 首次运行时建立完整索引。
- 后续运行只扫描修改时间晚于上次备份的文件。
- 定期(如每月)进行一次全量索引更新。
-
分离索引更新和备份操作:
- 后台任务定期更新文件索引。
- 备份时直接使用索引数据。
- 可以通过文件系统事件监控(如 watchdog)实时更新索引。
-
多线程文件复制:
- 使用多线程来同时复制多个文件,提高备份速度。
- 示例代码:
from concurrent.futures import ThreadPoolExecutor def parallel_backup(files: List[dict], max_workers: int = 4): with ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [executor.submit(backup_file, f) for f in files]
-
分块处理大文件:
- 将大文件分块并行复制。
- 使用多线程计算MD5值。
- 支持断点续传。
-
优先级队列:
- 小文件优先处理。
- 最近修改的文件优先。
- 重要目录优先。
-
缓存策略:
- 缓存文件MD5值。
- 缓存目录结构。
- 使用内存映射文件处理大文件。
-
预处理优化:
- 预先创建目录结构。
- 批量检查文件可访问性。
- 提前计算空间需求。
-
IO优化:
- 使用更大的缓冲区。
- 合并小文件操作。
- 使用异步IO。
-
存储优化:
- 压缩备份文件。
- 删除重复文件。
- 智能处理符号链接。
-
第一阶段:基础功能
- 基本的文件复制
- 增量备份和全量备份支持
- 日志记录
- Everything API 集成
- 排除规则支持
-
第二阶段:性能优化
- 并行文件复制
- 大文件分块处理
- 断点续传支持
- 重复文件处理
-
第三阶段:高级特性
- 实时文件监控
-
第四阶段:用户体验
- 图形界面
- 备份计划管理
- 状态监控和报告