
开源工具 iPhone Backup Sync 支持 Windows 上增量备份 iPhone 照片视频
来源标题:iPhone-backup-sync: Incremental iPhone DCIM backup for Windows
iPhone Backup Sync 是一款基于 Rust 和 Tauri 的 Windows 桌面工具,可对 iPhone DCIM 照片和视频进行快速增量本地备份,完全离线运行。它通过 libimobiledevice 与 WPD 协议直连设备流接口,避免 MTP 传输卡死,并在遇到文件大小冲突时以 _new 后缀保存而不覆盖原件。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
iPhone Backup Sync 是一款高性能桌面应用,使用 Rust、Tauri 以及 libimobiledevice / Windows Portable Devices (WPD) 协议,为 iPhone DCIM 照片和视频提供快速、增量的本地备份到 Windows 驱动器。它直接与底层设备流式接口通信,避免 MTP 传输卡死,在不覆盖原文件的前提下处理大小冲突,并且完全离线运行,无需任何云订阅。
功能 / 能力 iphone-backup-sync Windows 文件资源管理器 iTunes / iCloud for Windows 增量同步 支持——索引目标目录,仅复制新增或修改的资源 不支持——手动拖放;每次复制都会重新评估所有文件 部分支持——iTunes 创建不透明的设备镜像;iCloud 通过云端同步 冲突与重复处理 非破坏性——保留原始文件,大小不匹配时保存为 <stem>_new.<ext>,跳过已验证的重复文件 破坏性 / 靠猜测——提示覆盖或跳过,且不做字节级校验 不透明——根据云端缓存状态覆盖或替换本地文件 连接稳定性与崩溃恢复 高——原子化 .part 分块流式传输、锁文件崩溃恢复、自动隔离 差——卡死于“Catastrophic failure”或“Device unreachable”,留下损坏的部分文件 中等 / 僵化——单次连接超时即导致整个备份批次失败 云与订阅要求 无——100% 离线,本地直连 USB 传输 无——离线 USB,但受 MTP 驱动卡顿拖累 完整图库必需——需要 Apple ID 及付费 iCloud 存储方案以支持大图库 卡住文件处理 按 S 键即时跳过;将失败资源加入黑名单而不中断批次 无响应——挂起整个资源管理器窗口;需要结束任务或拔掉设备 整个流程失败——遇到无法读取的文件即中止备份 路径与 Unicode 完整性 已清理——剥离 iOS 中不可见的 Unicode 方向标记(\u{200E}、\u{200F} 等) 未清理——路径检查失败或在 NTFS 驱动器上创建幽灵文件夹 抽象化——存储在专有的 iOS 备份数据库结构中 预览 从 GitHub Releases 页面下载最新的 .exe 安装程序或独立可执行文件。 首次运行安装程序时,Windows Defender SmartScreen 可能显示警告对话框,提示“Windows protected your PC”或“Unknown Publisher”。 为什么会这样? iphone-backup-sync 是一个免费的、社区驱动的开源项目。能够抑制此提示的代码签名证书(Extended Validation / EV 证书)需要向商业证书颁发机构支付昂贵的年度订阅费用。 为避免通过 USB 传输时 iOS 转码导致的传输中断崩溃,请配置你的设备: 选择“Keep Originals”可防止 iOS 尝试实时进行 HEIC/JPEG 或 ProRes/H.264 转码,而后者正是 MTP 流超时和设备重置的主要原因。 直接 WPD 与 MTP 流式传输:直接对接 Windows Portable Devices COM 子系统(IPortableDeviceManager、IPortableDevice、IPortableDeviceContent、IStream),并兼容 ifuse / libimobiledevice 架构,消除资源管理器外壳崩溃。 递归 DCIM 扫描:递归遍历 iPhone 存储根目录,自动发现所有媒体子目录(DCIM/*APPLE)。 字节级精确比对与分类:通过索引哈希表扫描目标文件夹,将资源分类为: NEW:目标备份目录中不存在该资源。 MISMATCH:资源存在但文件大小不同。 VERIFIED_IGNORED:资源存在且字节完全匹配,或已存在大小完全一致的 _new 变体。 SKIPPED:资源位于持久化跳过列表中。 非破坏性冲突解决:大小不匹配的文件以 _new 后缀保存(例如 IMG_1234_new.HEIC)。如果已存在大小相同的 _new 文件,则标记为已备份并自动跳过。 弹性分块流式传输:媒体以 64 KB – 256 KB 的缓冲区直接流式写入临时 .part 文件,仅在传输完成后才刷新并原子化重命名为最终目标文件。 崩溃恢复与锁文件跟踪:使用 current_copying.tmp 锁文件。如果复制过程中发生 MTP 断开或系统关机,中断的文件会在下次启动时自动隔离到 skip_list.json,并删除部分文件。 即时跳过快捷键(S):按 S 或点击 Skip Current 可立即放弃正在传输的文件,删除其部分片段,将其加入 skip_list.json,并继续处理剩余队列。 跳过列表管理:完整的 UI 界面,可查看黑名单文件、删除特定条目或清空整个跳过列表。 Unicode 路径清理:从 iOS 元数据中剥离不可见的 Unicode 方向控制标记(\u{200E}、\u{200F}、\u{202A}..=\u{202E}),以确保 NTFS 路径有效。 实时传输指标:显示当前文件进度、整体批次百分比、流式吞吐量(MB/s)以及实时状态横幅。 离线与隐私:严格通过本地 USB 运行,零遥测、零网络调用。 架构 iphone-backup-sync/ ├── src/ # Vue 3 + TypeScript 前端 │ ├── App.vue # 仪表盘、实时监视器和文件表格 │ ├── types.ts # 与 Serde 同步的 TypeScript 数据契约 │ ├── style.css # 深色模式样式、响应式指标、自定义滚动条 │ └── main.ts # 应用启动入口 ├── src-tauri/ # Rust 后端(Tauri v2) │ ├── src/ │ │ ├── wpd.rs # Windows Portable Devices COM 封装与分块流式传输 │ │ ├── sync.rs # 比对引擎、崩溃恢复和跳过列表管理器 │ │ ├── lib.rs # Tauri 命令分发和 IPC 事件发射器 │ │ └── main.rs # 可执行文件入口 │ ├── Cargo.toml # Rust 依赖(windows、tokio、walkdir、serde) │ └── tauri.conf.json # Tauri v2 应用配置与打包设置 └── .github/workflows/ # GitHub Actions CI/CD 流水线 ├── ci.yml # 自动化格式化、代码检查和构建验证 └── release.yml # 通过 tauri-action 自动打包发布 从源码构建 前置条件
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。