SmartCopy v0.3.1
Windows 文件复制 · 移动

中断后继续,
删除前先 校验.

资源管理器的复制对话框一旦中断,不会告诉你进行到哪里。SmartCopy 把任务放进队列,可以暂停和继续,并且只有在校验通过后才删除移动的来源。拔掉 U 盘、NAS 断开、重启,进度都还在。

免安装 · 无需管理员权限 · Windows 10 / 11(64 位)

实际界面布局 · 示例数据
SmartCopy v0.3.1 管理控制台日志─ □ ✕
来源
D:\照片 2024
D:\相机原片
目标
E:\备份
操作
复制移动
校验
SHA-256
开始任务
照片 2024 → 备份 进行中
12,481 / 20,004 个文件 14.2 GB / 22.8 GB 186 MB/s 剩余时间 00:47

成功 12,481 · 跳过 0 · 失败 0 · 剩余 8.6 GB

D:\照片 2024\2024-07\IMG_4821.ARW

暂停 取消
项目归档 → NAS 等待重新连接
3,902 / 6,110 个文件 41.0 GB / 64.3 GB 已暂停

设备已断开 — 重新连接后会继续 (WinError 64)

发票 → 归档 完成
412 / 412 个文件 SHA-256 校验通过
移动的顺序

来源最后才删除

移动分三个阶段,前一个结束才进入下一个。

阶段 1

复制

在目标位置写成 .scpart 临时文件。写完之后才改成最终名称,所以中途停下也不会让写了一半的文件看起来像正常文件。

阶段 2

校验

比对大小和修改时间,需要时还比对 SHA-256。若不一致就删除该副本并重新复制。

阶段 3

删除来源

只有通过校验的文件才删除来源。被跳过的文件的来源会保留,空文件夹最后再清理。

同一驱动器内的移动只是改名 — 很快,而且根本不会产生中间状态。上面的三个阶段只用于跨驱动器。

同名文件已存在时

六种冲突策略

可以在创建任务时预先决定,也可以让它每次询问。选择询问时,对话框里可以勾选 对之后的冲突也应用相同选择

策略作用适用场景
overwrite覆盖目标来源始终最新的单向备份
skip跳过并保留来源只补齐缺失的部分
rename名称 (1).扩展名新建为两者都要保留时(默认)
keep_newer保留修改时间较新的一方合并两边都改过的文件夹
keep_larger保留较大的一方混有被截断保存的文件时
ask显示双方的大小和时间并询问需要逐个判断时
中断 · 拔出 · 断电

它记得停在哪里

进度不只存在于屏幕上,而是写入磁盘。所以关掉应用或断电都不会从头再来。

作业日志

每完成一个文件就追加一行。因为只做追加,断电最多损坏最后一行,而那一行直接丢弃。

  • 再次运行会跳过已完成的文件
  • 成功结束的作业会自行删除日志
  • 启动时会找出未完成的作业并询问是否继续

%LOCALAPPDATA%\SmartCopy\jobs\

单个文件内部的续传

大文件的 .scpart会原样保留已经写到哪里。只有在旁边的元数据文件确认来源的大小和修改时间没变之后才续传。

  • 如果来源变了就不续传,而是重头再来
  • 其他作业留下的残留会就地清理

U 盘拔出 · NAS 断开

设备消失时不会算作失败 —— 任务会进入 等待重新连接 状态并暂停。重新连接后会从中断处继续。

WinError 21 · 53 · 59 · 64 · 1167

只重做失败的文件

临时性问题(例如被其他程序锁定的文件)会按 0.5 秒 → 2 秒 → 5 秒自动重试。仍然失败的会留在列表里,用 重试 按钮只重跑那些 —— 文件夹结构原样保留。

无人看管时

设置一次,它自己运行

如果每次都在手动点同样的按钮,那是程序该做的事。

监视文件夹

文件进入文件夹并安静下来后,就运行你保存的作业。不会去抓正在写入的文件——它会等变化停止。

smartcopy-cli watch "交付" --folder D:\读卡导入

任务计划程序

每天凌晨三点,或登录时。无需管理员权限即可设置,也能直接在 Windows 任务计划程序中删除。

smartcopy-cli schedule --install "每周备份" --when daily --at 03:00

资源管理器右键

右键点击文件夹,就会出现你保存的作业名称。选中后窗口会填入该设置——开始仍由你来点。

证明彼此作证

单张证明很容易被丢掉。因此每张都包含前一张的哈希——抽掉中间一张,链条就断了。

smartcopy-cli ledger --verify

这不是时间戳机构。它挡住的是:交付了十次,却只拿出中意的九次。

哪怕放进 10 万个

队列来安排顺序

处理什么方式
块大小根据介质决定 —— 固定磁盘 4 MB、U 盘 1 MB、网络 256 KB。暂停和取消在块边界响应,所以不会一味加大。
同时运行的作业默认 2 个,因为多个作业同时压同一块磁盘反而整体更慢。
优先级每个作业带有优先级,高的先走。相同时按加入顺序。
大批量枚举scandir 遍历,并且不跟随符号链接和联接,所以不会陷入循环复制。
长路径 · Unicode通过绕开 260 字符限制的路径前缀来处理。Unicode 名称原样保留。
进度刷新合并为每 0.2 秒一次 —— 这样在 10 万个文件时,刷新屏幕不会比复制还贵。
同时的文件数在一个作业内同时复制多个文件(最多 16)。小文件很多或使用 NAS 时收益最大。
速度限制每秒字节上限。适合一边跑备份一边开会的时候。各工作线程共享同一个桶。
过滤包含/排除模式、整个文件夹排除、大小与日期范围、排除隐藏文件。
预览一个字节也不写,只计算将会移动什么。
开始前的检查先确认目标的剩余空间、目标是否位于来源之下、是否为受保护路径,以及来源是否存在。

比 robocopy 慢。 因为它为每个文件记录续传信息、校验已复制的内容、并写入日志——这三件事正是本程序存在的理由。 在内置 SSD 上,小文件约慢 5~15 倍,大文件约慢 7 倍。测得的数字和测量方法都放在代码库里。

多个作业集中一处

管理控制台

窗口看的是此刻在搬什么,控制台看的是全貌:队列、历史、恢复、日志、校验都在一屏。 smartcopy-cli admin 或窗口界面的 管理控制台 按钮打开。

能看到什么

  • 进度横幅 —— 多个作业的合计进度、速度、剩余时间
  • 作业卡片 —— 状态标签、进度、成功/相同/跳过/失败
  • 作业详情 —— 失败列表与原因、警告、平均速度
  • 恢复 —— 选择中断的作业继续或丢弃
  • 完整性校验 —— 用清单比对目标是否原样

能操作什么

  • 新建作业 —— 路径选择窗口、过滤、性能选项
  • 开始前检查 —— 提前提示受保护路径和剩余空间
  • 暂停 / 继续 / 取消 / 重试失败项(单个或全部)
  • 调节同时运行的作业数

控制台只在 127.0.0.1 上打开 ,并且需要每次运行时重新生成的令牌。外部域名指向该地址的手法(DNS 重绑定)会被 Host 检查拦下,而其他站点让浏览器发出的请求会被 Origin 检查拦下。

不开窗口

命令行里也是同一个引擎

批处理和任务计划程序就用 smartcopy-cli.exe

# 复制文件夹 + SHA-256 校验 > smartcopy-cli copy "D:\照片 2024" E:\备份 --verify hash [running] [################----] 83.3% 14.2 GB/22.8 GB 186 MB/s ETA 00:47 # 移动 —— 同名时改用新名称 > smartcopy-cli move C:\存档 E:\仓库 --conflict rename # 查看中断的作业并继续 > smartcopy-cli recover > smartcopy-cli recover --resume # 比对之前复制好的结果 > smartcopy-cli verify D:\来源 E:\备份\来源 --level hash # 注册资源管理器菜单(当前用户,无需管理员权限) > smartcopy-cli shell --install
下载

两个都不需要安装

设置和日志只写在 %LOCALAPPDATA%\SmartCopy ,别处不写。

窗口界面

SmartCopy.exe

拖放即可加入,用作业卡片查看进度。资源管理器右键菜单调用的也是这个文件。

13.6 MB · SHA-256 2e1f9b91034f8cea14cf6d2236741b7a165b25ebaf364e1b9a7d203578892197

下载

命令行

smartcopy-cli.exe

copy · move · recover · verify · shell。适合脚本和计划任务。

13.6 MB · SHA-256 d3f8f003b8d1f2b22faf621b5b1531c73a6e456315124e609be43b9e55d53c96

下载

资源管理器右键集成

右键文件或文件夹选择 添加到 SmartCopy,在要移动到的文件夹里选择 设为 SmartCopy 目标。分几次添加也会汇集到同一个窗口。

只注册在 HKEY_CURRENT_USER 之下 —— 一条 shell --uninstall 即可撤销

需要什么

  • Windows 10 / 11(64 位)
  • 无需管理员权限
  • 支持 SMB · NAS · U 盘 · 可移动磁盘
  • 从源码运行需要 Python 3.9 以上(仅标准库)