首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C 盘告急!WorkBuddy 数据目录搬家到 D 盘全记录:Junction 方案 + 6 个实测坑

C 盘告急!WorkBuddy 数据目录搬家到 D 盘全记录:Junction 方案 + 6 个实测坑

原创
作者头像
用户12783842
发布于 2026-09-24 12:50:51
发布于 2026-09-24 12:50:51
1.7K0
举报

一、背景:我要解决什么问题

我的 C 盘只有 128GB,迁移前常年只剩约 11GB,系统天天弹盘满警告;而 WorkBuddy 的数据目录(C:\Users\<用户名>.workbuddy,会话记录、记忆文件、插件缓存、日志)越用越大,干活都不敢让它生成长报告。(可惜当时没留截图,下文的"迁移后"属性图可作对照)

我的目标很明确:

  1. 数据全部搬到 D 盘,C 盘空间真正释放。
  2. WorkBuddy 无感知 —— 程序照常用,硬编码的老路径继续有效。
  3. 可回滚、零数据丢失。

二、方案设计:为什么选目录联接(Junction)

我第一反应是改环境变量,实测失败:这类程序里读环境变量的代码路径有 100 多处,但日志、刷新、设备 ID 等模块是硬编码 C:\Users\xx.workbuddy 的,改了 env 照样落回 C 盘。

最终方案是 Junction(目录联接):把原路径变成一个"传送门",所有路径解析(包括硬编码)都透过它落到 D 盘。对上层应用完全透明,也不用管理员权限(在用户目录下建 Junction 不触发 UAC)。

联接建好后,dir 一眼就能看出端倪:<JUNCTION> 标签 + 方括号里的 D 盘真身路径。对上层完全透明,程序照常读写老路径,数据实际全部落在 D 盘:

cmd /c dir C:\Users\xx | findstr /i workbuddy

三、实操步骤

第 1 步:只读盘点

Get-Item "$env:USERPROFILE.workbuddy" -Force | Select Attributes # 确认还不是 ReparsePoint

(Get-ChildItem "$env:USERPROFILE.workbuddy" -Recurse -Force -File |

Measure-Object Length -Sum) # 统计文件数/字节

Get-PSDrive C,D # 看两块盘剩余空间

第 2 步:等程序完全退出(不要主动杀进程)

程序有自启/守护逻辑,杀一个补一个。正确姿势是"守株待兔":轮询进程,连续 10 秒检测不到才算退干净。

第 3 步:增量同步 + 双向校验

robocopy "C:\Users\xx.workbuddy" "D:\Users\xx\WorkBuddy" /E /COPY:DAT /DCOPY:DAT /R:2 /W:1 /LOG:rc.log

⚠️ 关键纪律:绝不先删源。顺序必须是:复制 → 校验目标文件数和字节数都不小于源 → 源目录改名备份(.old-时间戳)→ 才建联接:

Rename-Item "C:\Users\xx.workbuddy" ".workbuddy.old-20260921-1030"

New-Item -Path "C:\Users\xx.workbuddy" -ItemType Junction -Value "D:\Users\xx\WorkBuddy"

第 4 步:验证真的在用新盘

别只看脚本日志。去看 D 盘目标目录里最新文件的时间戳是不是还在往前走:

ls -lt --time-style=+%H:%M:%S /d/Users/xx/WorkBuddy/ | head

时间戳在动 = 迁移真成功了,比联接属性=True 更有说服力。

四、踩坑 & 解法(本文精华)

坑 1:程序运行中复制,进度条永远追不上

错误 32 (0x20) 另一个程序正在使用此文件。日志、会话、缓存在被持续写入,复制速度赶不上写入速度,永远收敛不了。解法:先让程序完全退出再同步。

坑 2:后台隐藏进程跑长任务,活不过 10 分钟

我用 Start-Process xxx.bat -WindowStyle Hidden 挂后台跑复制,实测每次都莫名死掉。解法:长任务老老实实用用户可见的前台窗口跑,脚本末尾加 pause,顺便加单实例锁(锁文件里写进程 PID,防止手滑双击开两个窗口互相踩)。

坑 3:PowerShell 脚本中文乱码 + 莫名语法错误

PowerShell 5.1 下脚本没存成 UTF-8 with BOM,中文全成乱码,还会连带吞掉换行导致语法错误。校验方法:IO.File::ReadAllBytes($p)0..2 应该是 EF BB BF。

坑 4:迁完 C 盘空间没变?备份还没删!

流程是"复制 + 源改名",那 900MB 还实打实占在 C 盘。删备份时又踩两个坑:

- 十万级小文件目录整体删除会直接失败(跑 26 秒一个文件没动)。解法:按顶层条目分块循环删,每删一个 Test-Path 复核。

- logs\2026-09-23 当日日志目录怎么都删不掉,一度以为是当天日志有保护。用 icacls <路径> 一看真相:WorkBuddy 给当日日志目录挂了显式 DENY ACE(拒绝删除,子目录全部继承),日期翻篇后锁还不拆,旧目录就永远删不掉。解法一条命令:

icacls "C:\Users\xx.workbuddy\logs\2026-09-23"

第一行那个 (OI)(CI)(DENY)(DE,DC) 就是元凶:拒绝删除、拒绝删子项,整个目录树全部继承。读写都正常,唯独删不掉、改名也失败 —— 下次遇到"权限看起来正常但文件就是删不掉",先 icacls 查一下有没有 (DENY),八成就是它。

坑 5:升级一次,桌面图标消失一次

迁移后 WorkBuddy 升级,桌面图标没了。排查发现:升级器只认 C:\Users\xx\Desktop 这个默认桌面路径,而我的桌面早就自定义在 D:\桌面文件-xxx。解法:从开始菜单把 WorkBuddy.lnk 复制一份到真实桌面即可。自定义过桌面路径的注意,升级后大概率要手动补一次。

坑 6:工具报"删除失败",文件其实已经删了

有一次工具报 trash-failed,但用 Test-Path 一查,文件早就进回收站了。教训:任何工具报的状态都要用独立手段复核,别信单一来源。另外注意:进了回收站 ≠ 释放了空间,要清空才真释放;回收站里还有大量"孤儿索引"(原文件早没了只剩 544 字节索引),别被数量吓到。

五、效果

迁移后 C 盘剩余空间

迁移前我的 C 盘(128GB)只剩约 11GB,天天弹盘满警告;迁移并清理备份后稳定在 12GB 以上,且数据增长全部落在 D 盘,C 盘从此不再被 WorkBuddy 蚕食。

- C 盘释放约 900MB+,且之后数据增长全部落在 D 盘

- WorkBuddy 一切功能正常,零配置改动

- 后续升级只有"桌面图标"一个小坑,复制 lnk 即修

六、可复用片段(抄作业区)

  1. 复制(程序已退出)robocopy $Src $Dst /E /COPY:DAT /DCOPY:DAT /R:2 /W:1
  2. 校验后:源改名备份 → 建联接 Rename-Item $Src ($Src + ".old-" + (Get-Date -f yyyyMMdd-HHmmss)) New-Item -Path $Src -ItemType Junction -Value $Dst
  3. 拆"删不掉"的 DENY 锁 icacls <挂 deny 的目录> /remove:d <用户名>

两个安全提醒:

  1. 卸载程序前先删 Junction,否则卸载器会顺着联接把 D 盘真数据一起删光
  2. 想删联接只用 IO.Directory::Delete($link, $false)——只删链接不递归,千万别对着联接用递归删除 总结 C 盘搬家这事不难,难的是那 6 个坑里的每一个都够你排查半天。希望这篇能帮你把半天变成十分钟。有问题评论区见。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、背景:我要解决什么问题
  • 二、方案设计:为什么选目录联接(Junction)
  • 三、实操步骤
  • 四、踩坑 & 解法(本文精华)
  • 五、效果
  • 六、可复用片段(抄作业区)
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档