1. 背景
最近由于 C 盘空间不足,准备将 C 盘从 200GB 扩容到 350GB,同时保留原有的 D、E 盘。
考虑到不想使用第三方分区工具,便采用了比较直接的"笨方法":先将 D 盘文件临时移动到 E 盘,再通过 Windows 自带的磁盘管理工具删除并重建 D 分区,将其中 150GB 分配给 C 盘,最后把文件恢复到 D 盘。
原本以为几十 GB 的文件很快就能移动完成,结果 D 盘包含大量 Python、Conda、Git 等软件和开发环境文件,总计约 92 万个文件,使用 Windows 资源管理器移动了 2 小时才完成 40%。
完成分区调整后,考虑到还需要将这些文件从 E 盘复制回 D 盘,便尝试使用 Windows 自带的 Robocopy 多线程复制工具。实际使用后发现,复制速度明显提升,省去了大量等待时间。
因此,简单记录一下 Robocopy 的使用方法,方便以后迁移大量小文件时参考。
2. Robocopy 多线程复制
Robocopy 是 Windows 自带的文件复制工具,无需额外安装。
打开 PowerShell,执行:
robocopy "E:\D" "D:\" /E /MT:16 /R:1 /W:1 /XJ /COPY:DAT /DCOPY:DAT /NP
其中,E:\D 是源目录,D:\ 是目标目录,根据实际情况修改即可。
参数说明
| 参数 | 作用 |
|---|---|
/E |
复制所有子目录,包括空目录 |
/MT:16 |
启用 16 个线程并行复制 |
/R:1 |
失败后重试 1 次 |
/W:1 |
重试等待 1 秒 |
/XJ |
排除目录联接点,避免递归复制 |
/COPY:DAT |
保留文件数据、属性和时间戳 |
/DCOPY:DAT |
保留目录数据、属性和时间戳 |
/NP |
不显示逐文件复制百分比 |
核心参数是 /MT:16 ,可以根据设备性能调整线程数量,例如 /MT:8、/MT:16、/MT:32。
线程数并非越大越快,尤其是同一块硬盘内复制时,需要根据实际情况选择。
3. 检查复制结果
复制完成后,Robocopy 会输出统计信息:
Total Copied Skipped Mismatch FAILED
Dirs : ...
Files : ...
Bytes : ...
重点检查 FAILED 是否为 0。
还可以执行以下命令检查是否存在需要补复制的文件:
robocopy "E:\D" "D:\" /E /L /R:0 /W:0 /XJ /COPY:DAT /DCOPY:DAT /NP
其中 /L 表示仅检查,不实际复制。
注意,该检查主要比较文件大小、修改时间等信息,并非逐文件哈希校验。
4. 总结
这次磁盘扩容过程中最大的感受是:
复制大量小文件时,文件数量对速度的影响可能比文件总大小更明显。
对于包含几十万甚至上百万个小文件的目录,使用 Robocopy 多线程复制通常更高效。
另外,Robocopy 默认执行复制操作,不会删除源文件。建议确认文件完整后,再手动清理临时备份。
以后遇到 Python 环境、Conda 依赖、Git 仓库等大量小文件迁移,可以优先尝试 Robocopy。