Migration Flow

五步迁移,步步可逆

完整的事务流程设计,每一步都有校验和回退机制。中途失败可重试,迁移成功后随时回滚到原状。

01
复制
02
校验
03
备份
04
链接
05
清理
Step 01

CopyFile2 并行复制

利用 Windows CopyFile2 API 的 unbuffered IO 模式,配合 Rust Rayon 并行框架,大文件和小文件分别走不同复制策略,最大化磁盘吞吐。

  • 大文件走 CopyFile2 unbuffered 模式,绕过系统缓存直接 DMA 传输
  • 小文件走 Rayon 并行复制,自动根据 CPU 核心数调整并发度
  • SSD 上 8 线程并行,HDD 上单线程顺序读写,避免磁头抖动
30%

大文件复制速度提升

8 线程

SSD 最大并行度

copy_engine.rs

fn copy_parallel(src: &Path, dst: &Path) -> Result<()> {
  let meta = fs::metadata(src)?;
  if meta.len() > LARGE_FILE_THRESHOLD {
    copy_file2_unbuffered(src, dst)?;
  } else {
    files.par_iter().for_each(|f| {
      fs::copy(&f.src, &f.dst).ok();
    });
  }
  Ok(())
}
源文件 0xA3F2...8B1C
目标文件 0xA3F2...8B1C
✓ 校验通过
Step 02

XXHash 完整性校验

复制完成后对源文件和目标文件做 xxHash64 校验比对,确保每一位数据都完整无误。校验不通过自动重试,最多三次。

  • xxHash64 极速哈希,4 GB/s 以上吞吐,校验不拖后腿
  • 逐文件比对源与目标哈希值,发现不一致立即标记重试
  • 三次重试仍失败则中止迁移,已复制文件不受影响
4 GB/s

xxHash64 吞吐量

3

最大重试次数

Step 03

元数据安全备份

迁移前将原始路径、文件属性、时间戳等元数据写入 SQLite WAL 数据库,即使程序崩溃也能从断点恢复。

  • 完整记录原始路径、文件属性、创建/修改/访问时间戳
  • SQLite WAL 模式支持并发读写,不阻塞其他操作
  • 事务型写入,每步完成后持久化进度,崩溃可恢复

migration_records

idINTEGER PK
src_pathTEXT
dst_pathTEXT
file_hashTEXT
created_atDATETIME
modified_atDATETIME
statusENUM
WAL Mode
Step 04

Junction / Symlink 透明链接

在原位置创建 NTFS Junction(目录)或 Symlink(文件),所有应用读写操作透明转发到新位置,零感知无感迁移。

  • 目录迁移创建 NTFS Junction,文件迁移创建 Symlink
  • 应用层完全透明,读写操作自动转发到新位置
  • 支持 Reparse Point 深度检测,避免嵌套链接问题
Step 05

清理源文件 & 释放空间

确认链接创建成功后,安全移除源文件释放磁盘空间。清理前二次确认链接有效性,确保应用不受影响。

  • 清理前验证 Junction/Symlink 可访问,确保链接有效
  • 删除源文件后更新迁移记录状态为 completed
  • 一键回滚:逆向操作恢复到迁移前状态
删除链接 复制回原位 恢复元数据 完成回滚

完整逆向操作,恢复到迁移前状态

Workflow

安全迁移,放心回滚

五步事务流程,每一步都有保障。