把 C 盘上占地方的大文件夹搬到 D 盘 / E 盘,原地留一个「传送门」, 让桌面快捷方式、游戏启动器、程序里写死的路径全都照常工作。
纯离线:不联网、不上传、不安装、不写注册表、不需要管理员权限。 单个 exe,只依赖 Windows 自带的 .NET Framework 4.x。
它不是「一键清空 C 盘」。
C 盘上占地方的大头,很多是搬不动的:系统文件、软件数据目录、 WSL 的虚拟磁盘、带内核级反作弊的游戏、路径写死的虚拟环境。 硬搬它们轻则软件打不开,重则系统起不来。
所以这个工具的一半价值在于告诉你哪一样该去哪儿搬 (「这 7 GB 是微信的,去 微信 → 设置 → 文件管理 → 更改 里搬」), 而不是把能勾的都勾上。报告里「不能碰」的行是灰的,勾不动 —— 那是故意的。
手动「剪切 → 粘贴」最要命的毛病是粘到一半断了,两边都不完整, 而且你不知道少了什么。这个工具的顺序是:
复制 → 全量校验:逐个文件比对指纹,一个字节一个字节地验
→ 核对【全部通过】,才把 C 盘的原件改名成「备份」
→ 在原来的位置建目录联接(传送门)
→ 验证传送门真的指向新位置
→ 才删掉备份
任何一步没过,C 盘一个字节都不动。 最坏的结果是「没搬成」, 不会变成「东西没了」。
搬完还能撤销:--undo 会把文件搬回原位、拆掉传送门。
| 位置 | 为什么 |
|---|---|
C:\Windows、Program Files、ProgramData |
系统命脉 |
C:\Users 整个 |
所有用户的个人文件 |
| 桌面、文档、图片、视频、音乐 | 位置是写死的绝对路径,搬了当场炸 |
| 微信 / QQ 聊天记录、WSL 虚拟磁盘 | 必须用它们自己的「更改保存位置」 |
| 带内核级反作弊的游戏(原神、无畏契约、PUBG、堡垒之夜…) | 搬完留下的联接会被反作弊驱动检查,有封号风险 |
关于最后一条:这一条是「代价不对称」,不是「已证明会封号」。 要证明它会封号得拿真账号去试,代价太大;而不搬的代价只是少腾点地方。 分不清的时候,选代价小的那一边。
零第三方依赖 —— 用 Windows 自带的 csc,不需要装 .NET SDK、不需要 NuGet:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo `
/langversion:5 /target:winexe /platform:x64 /optimize+ `
/out:build\cmover.exe /win32manifest:app.manifest `
/r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll `
Core.cs Log.cs Migrate.cs Report.cs Program.cs Ui.cs(换行用的是反引号 —— PowerShell 的续行符。用 cmd 的 ^ 会被当成一个文件名,
csc 报 error CS2001: 未能找到源文件"^"。这一行是实测过的。)
/langversion:5 是刻意的:只写 C# 5 支持的语法,
就保证了「系统自带的编译器一定编得过」,不用管对方装没装新版 SDK。
powershell -ExecutionPolicy Bypass -File test\run-test.ps192 项检查,全绿才退出 0。 覆盖:编译、扫描、搬运、校验、 校验器的反向用例(改一个字节 / 多一个文件 / 少一个文件 —— 必须报「对不上」)、 知识库判定、拒绝路径、撤销、日志。
其中两处是刻意设计的:
- 反向用例。 一个永远说「通过」的校验器不是校验器。所以测试里专门 制造「两边不一致」的局面,要求它必须报错。同理,知识库的测试里 既有「该拒的必须拒」,也有「能搬的必须放行」—— 否则「什么都拒」 也能让测试全绿,而那样工具就废了。
--selftest不抄名单。 它直接引用代码里的Scanner.LockedNames, 所以「知识库说能搬」和「搬运守卫会拒」这两套话不可能各走各的。 (在测试脚本里另抄一份名字列表的做法,抄的那份会悄悄过期。)
不带参数 打开图形界面
--scan <报告.html> [--min-gb 2] [--depth 5] [--txt 报告.txt]
扫描并生成可视化报告,不动任何文件
--migrate <文件夹> <目标盘根目录> [--fast] [--dry] [--keep-backup]
--verify <原来> <现在> [--fast] 只比对两边一不一样,什么都不动
--undo <文件夹> 撤销某次搬运
--records 列出所有搬运记录
--check 检查所有传送门是否还通
--kb <路径> 查一个路径该怎么处理(退出码 0=能搬,1=不能搬)
--selftest 自检:知识库和搬运守卫说的是不是同一套话
--log 打印日志文件路径
退出码 0 = 成功,非 0 = 失败。
- 没有数字签名。 第一次运行 Windows 会弹「已保护你的电脑」, 要点「更多信息 → 仍要运行」。这是所有没买签名的程序都会遇到的,不是中毒。
- 杀毒软件可能误报。 它确实会删文件夹、建目录联接 —— 这些动作 和某些病毒的行为长得像。源代码全在这里,可以自己看。
- 只在一个环境上实测过:Windows 11 + .NET Framework 4.x(x64)。 32 位系统没测过。
- 传送门是目录联接(junction)。 绝大多数程序照常工作,但少数 会检查重解析点的程序可能不认。
- 搬走的文件夹不要再手动挪位置,否则传送门失效。要挪就先
--undo。 - 界面和文档是中文的。
程序会在 %LOCALAPPDATA%\CMover\cmover.log 写运行日志:每次启动记几行
「当时是什么情况」(系统、是不是管理员、程序在哪、带了什么参数),
搬运和撤销的每一步也记。超过 1 MB 就在下次启动时轮成 .log.1。
界面上有「打开日志文件夹」按钮 —— 日志藏在 AppData 里等于没有日志。
日志里没有文件内容,只有路径、大小、时间、错误信息。 而且写日志是「顺带」的事:写不进去顶多没有日志,绝不会因此影响搬运。
MIT,见 LICENSE。