C 盘红了?用 Windows 自带的 Junction,把软件数据”搬”到 D 盘,而它毫无察觉

C 盘红了。

你终于决定清理 C 盘。你打开系统设置(Win + I → 系统 → 存储),点进”其他”(或”显示更多类别”),想看看到底是谁在占用空间。结果映入眼帘的,是一长串程序数据文件:C:\Users\John\.workbuddy、C:\Users\John\.trae-cn、C:\Users\John\.nuget…… 一堆以 . 开头的目录,动辄几个 G 甚至几十个 G,全挤在 C 盘上。

这些都是各类开发工具、AI 助手的”家”——工作区缓存、模型文件、插件、索引,全都默认落在用户目录下。它们有一个共同点:不太好搬。

  • 设置里往往根本没有”更改保存路径”的选项,或者藏得极深;
  • 就算找到了选项,下次软件更新后可能又被悄悄改回默认,C 盘再次变红;
  • 有的工具干脆把绝对路径写进了配置甚至数据库里,你手动把文件剪切过去,它反而”找不到家”直接报错。

微信和 QQ 好歹在设置里有个”更改保存路径”,可对这些工具,你连个入口都找不到。

有没有一种办法,让软件永远认为数据还在 C 盘原来的位置,而实际文件全部躺在 D 盘?

有。Windows 自带这个功能,名字叫 Junction(目录联接)。而且它不挑软件——微信、QQ、Trae、各种 . 开头的工具目录,通吃。

Junction 是什么?

一句话:Junction 是 NTFS 文件系统层面的一个”传送门”。它在 C 盘原地放一个假的目录入口,任何程序访问这个入口时,文件系统会自动把读写转发到 D 盘的真实目录。

它和你熟悉的”快捷方式”完全不是一回事:

快捷方式(.lnk) Junction(目录联接)
存在层面 桌面上的一个普通文件 NTFS 文件系统的底层机制
谁能感知 只有双击它的人 所有程序、所有系统调用
对软件透明 否 完全透明

关键就在”透明”两个字:微信去读 C:\...\WeChat Files 时,它根本不知道脚下有一扇传送门——因为对它来说,这不是”跳转”,而是路径本来就在那里。所以软件更新、重装、注册表校验,统统不会破坏这个方案。

顺带一提,Junction 还有个好处:创建它不需要管理员权限(普通目录符号链接 mklink /D 需要管理员,Junction 不需要)。

动手:三步搬家

思路很简单:复制 → 原地让位 → 架传送门。

下面以”微信聊天记录”为例,假设我们要把它从

C:\Users\John\Documents\WeChat Files

搬到 D:\AppData\WeChat Files。

换成 C:\Users\John\.trae-cn → D:\AppData\trae-cn 这样的”点目录”,步骤一字不差。

第 0 步:先退出微信(以及所有可能占用这个目录的程序)。

第 1 步:把数据完整复制到 D 盘

打开命令提示符(不需要管理员权限):

robocopy "C:\Users\John\Documents\WeChat Files" "D:\AppData\WeChat Files" /E /COPY:DAT /XJ /R:1 /W:1
  • /E:复制所有子目录,包括空目录
  • /XJ:跳过 Junction/符号链接,防止复制时陷入死循环(重要!)
  • /R:1 /W:1:遇到被占用文件只重试 1 次、等 1 秒,避免卡死

robocopy 是 Windows 自带的,比资源管理器复制靠谱得多——它会显示进度、校验结果,中断了还能续传。

第 2 步:确认无误后,把原目录”让位”

先别急着删。稳妥起见,改名备份:

ren "C:\Users\John\Documents\WeChat Files" "WeChat Files.bak"

然后建一个空目录并挂上传送门:

mklink /J "C:\Users\John\Documents\WeChat Files" "D:\AppData\WeChat Files"

成功的话你会看到一行:

为 C:\Users\John\Documents\WeChat Files <<===>>> D:\AppData\WeChat Files 创建的联接

第 3 步:验证

  • 用 dir C:\Users\John\Documents /a 查看,会看到 <JUNCTION> 标记
  • 启动微信,正常收发消息、翻历史记录
  • 去 D:\AppData\WeChat Files 看一眼,新的聊天图片正在往这里落

一切正常后,观察几天,再把 WeChat Files.bak 删掉,C 盘空间就真正解放了。

小白三连问:怎么看、怎么查、能不能改

搬完家,新的疑问往往紧跟着来。这三个问题几乎人人都会遇到。

问题一:怎么知道一个目录是普通文件夹,还是 Junction?

有三种办法,从”肉眼”到”精确”:

① 看图标。Junction 目录在资源管理器里长得和普通文件夹几乎一样,但图标左下角带一个快捷方式的小箭头。看到”文件夹 + 小箭头”,八成就是个联接。

② 用 cmd 的 dir 命令(推荐,信息最全):

dir C:\Users\John /a

输出里普通文件夹显示为 <DIR>,而联接会明确标出类型和指向:

2026/10/24  15:00    <JUNCTION>     .trae-cn [D:\AppData\trae-cn]
2026/10/24  15:00    <SYMLINKD>     some-link [D:\elsewhere]
2026/10/24  15:00    <DIR>          Documents

<JUNCTION> 是目录联接,<SYMLINKD> 是目录符号链接,方括号里就是它指向的真实位置。普通文件夹没有方括号。

③ 用 PowerShell 一行查询(想知道单个目录的信息时最方便):

Get-Item "C:\Users\John\.trae-cn" | Select-Object LinkType, Target

输出类似:

LinkType  Target
--------  ------
Junction  D:\AppData\trae-cn

LinkType 为空就是普通文件夹;Junction 是目录联接;SymbolicLink 是符号链接。

问题二:怎么知道一个 Junction 指向了哪里?

其实上面三种方法全都顺带回答了这个问题:

  • 资源管理器里把鼠标悬停在 Junction 图标上,气泡提示会显示目标路径;
  • dir /a 看方括号 [...] 里的内容;
  • PowerShell 的 Target 字段。

进阶一点还可以用系统自带的:

fsutil reparsepoint query "C:\Users\John\.trae-cn"

它会显示底层的重解析点数据(里面能看到目标路径),排查疑难问题时有用。

问题三:Junction 创建之后,还能改指向吗?

不能直接改,但可以删了重建——而且这个过程完全无损:

Junction 的指向信息写在文件系统的重解析数据里,Windows 没提供”编辑指向”的命令。想换个目标(比如从 D:\AppData 挪到 E:\AppData),标准做法是:

rmdir "C:\Users\John\.trae-cn"
mklink /J "C:\Users\John\.trae-cn" "E:\AppData\trae-cn"

划重点:rmdir 删掉的只是”传送门”本身,D 盘(或 E 盘)里的真实文件一个都不会少。删完立刻重建,中间不过一两秒,软件甚至不会有感觉。

另外两个相关的小知识:

  • 重命名、移动 Junction 本身是允许的(在同一分区内)。比如把 WeChat Files 联接改名,不影响它指向哪里——变的只是”门牌号”。
  • 但反向操作要警惕:通过 Junction 往里面删除或修改文件,删改的是 D 盘的真实文件。传送门是双向透明的——这既是它好用的原因,也是新手最容易踩的地方:你以为在删 C 盘的”副本”,其实删的是唯一的正本。

实战清单:哪些目录值得搬

同样的三板斧,适用于一切”没有更改路径选项”的软件。开头提到的那些”点目录”就是重灾区:

  • AI 工具与编辑器:C:\Users\你\.trae-cn(Trae 的扩展、缓存)、.vscode、.codeium…… AI 编辑器越用越大,模型和扩展缓存悄悄吃掉几十个 G 是常事
  • 开发工具链:.nuget(.NET 包缓存)、.gradle、.m2(Maven)、.ollama(本地大模型,动辄 4~40 G 一个)——这些目录在软件里根本没有改路径的入口
  • QQ:C:\Users\你\Documents\Tencent Files
  • 微信:Documents\WeChat Files(虽然新版有改路径选项,但用 Junction 一劳永逸,不怕更新重置)
  • 各类软件的缓存目录:%LOCALAPPDATA% 下那些动辄几个 G 的文件夹(比如 Google\Chrome、各种游戏的 shader 缓存)
  • 游戏存档:很多老游戏把存档硬编码在”我的文档”下

一个小技巧:拿不准该搬哪个,就回到 设置 → 系统 → 存储 → “其他”,按大小排序,从最大的开始挑。

桌面、文档这类特殊文件夹优先用系统自带的”位置”选项卡(右键属性 → 位置)来迁移,那是官方做法;Junction 留给官方不管的地方。

几个必须知道的坑

  1. Junction 只能在本地 NTFS 盘之间使用。目标不能是 U 盘(exFAT)、网络路径,跨盘到 NTFS 的 D 盘没问题。
  2. 删除时小心:用 rmdir 删除 Junction 本身,不会删除 D 盘的真实文件;但如果你在资源管理器里把 C 盘那个 Junction 目录”递归删除”,部分工具会穿透联接把 D 盘源文件一起删掉。建议一律用 rmdir "路径"。
  3. 杀毒软件 / 备份软件可能误判:个别增量备份工具会穿透 Junction 造成重复备份,记得加排除规则(robocopy 的 /XJ 就是这个用途)。
  4. OneDrive 用户注意:如果”文档”、”桌面”被 OneDrive 接管了,先理清 OneDrive 的关系再操作,别把同步目录架进传送门里。
  5. 改路径设置 vs Junction,选一个:如果你已经用微信自带的”更改保存路径”改过了,目录位置就变了,先按实际路径操作,别对着记忆里的老路径打。

原理小结

Junction(目录联接)是 NTFS 从 Windows 2000 时代就支持的机制,本质是一个只指向本机目录的重解析点(Reparse Point)。Windows 在路径解析阶段就把请求转发到了目标位置,所以对应用层完全不可见。

这也是它比”改软件设置”更可靠的原因:改设置是在和每个软件的开发者博弈,而 Junction 是直接改写”现实”本身——路径没变,变的是路径背后的物理位置。


一句话总结:数据搬家,门牌号不动。 下次 C 盘再红,别再和软件设置斗智斗勇了。

# 完整流程速查(以任意目录为例)
robocopy "C:\源目录" "D:\目标目录" /E /COPY:DAT /XJ /R:1 /W:1
ren "C:\源目录" "源目录.bak"
mklink /J "C:\源目录" "D:\目标目录"
# 验证正常后:rmdir 不删源;确认稳定后删除 .bak

# 查看 / 验证
dir "C:\Users\John" /a                                  # <JUNCTION> 标记 + [指向位置]
Get-Item "C:\某目录" | Select-Object LinkType, Target    # PowerShell 查单个目录
fsutil reparsepoint query "C:\某目录"                    # 底层重解析点数据

# 修改指向(删除门不删数据,然后重建)
rmdir "C:\某目录"
mklink /J "C:\某目录" "D:\新目标目录"

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注