Skip to content
kleinblue-devPublic

About

纯离线 Windows 小工具:把 C 盘上占地方的大文件夹搬到 D/E 盘,原地留一个目录联接。零第三方依赖的单 exe,用系统自带 csc 编译。

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

C盘轻量迁移清理器 (CMover)

把 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.ps1

92 项检查,全绿才退出 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。

About

纯离线 Windows 小工具:把 C 盘上占地方的大文件夹搬到 D/E 盘,原地留一个目录联接。零第三方依赖的单 exe,用系统自带 csc 编译。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages