
你的 C 盘可能还能抢救一下:Windows 新式压缩(WOF / CompactOS)科普与实操指南
系统盘红了,又不想删东西?Windows 其实藏了一套很多人不知道的”透明压缩”功能——不是传统 NTFS 压缩那种上古技术,而是专门给程序文件和系统文件设计的现代压缩方案。这篇文章讲清楚它是什么、怎么用、用在哪里效果最好,以及在最后——知心自己踩过的一个真实的坑。
引子:为什么你可能从来没听说过这个功能
Windows 10 开始,微软悄悄给系统加了一套新的文件压缩机制。它和传统的 NTFS 压缩不一样,不是简单地”把文件变小”,而是通过一个叫 WOF(Windows Overlay Filter) 的内核过滤器,在文件系统层面做透明压缩——文件在磁盘上被压缩存储,但应用程序读取时完全无感知,就像在读普通文件一样。
微软最初设计它,是为了让小容量设备(比如 32GB 的平板)也能跑得动 Windows。但后来人们发现,这东西对”装了一堆专业软件和开发环境”的大容量工作站场景也非常有用。
有社区实测数据可以参考:ARK 方舟从 169GB 压缩到 91GB,省了 78GB;Office 从 4.2GB 压缩到 2.3GB,省了 45%。我自己的系统盘(装了大量 NI、Autodesk、Siemens NX、SOLIDWORKS、Unity、Adobe、Anaconda、各类 SDK 和包缓存),用这套压缩回收了数百 GiB 的空间。
这不是”稍微省一点”,是真的肉眼可见地回收了很大一块空间。
两种压缩,别搞混了
很多人对 Windows 压缩的印象停留在文件属性里那个”压缩内容以便节省磁盘空间”的勾选项。那是传统 NTFS 压缩,历史悠久但效果一般,而且对性能有一定影响。
新式压缩是另一套完全不同的东西:
| 类型 | 入口 | 面向什么 | 压缩率 |
|---|---|---|---|
| 传统 NTFS 压缩 | 文件属性勾选、compact /c | 通用文件,什么都能压 | 一般 |
| 新式 WOF /EXE 压缩 | compact /EXE:XPRESS16K、compact /EXE:LZX、CompactOS | 程序文件、OS 二进制、资源文件 | 明显更好 |
新式压缩之所以效果更好,是因为它专门为”频繁读取但很少修改”的场景优化。程序文件(exe、dll、sys)、SDK 资源、文档、模板这些东西,正好符合这个特征。
还有一个关键优势:用 /EXE 压缩的文件,一旦在运行中被修改,会自动退回非压缩状态,不需要手动维护。这和传统 NTFS 压缩不一样,后者改了以后可能还是压着的。
四种算法怎么选
compact /EXE 支持四种压缩算法:
| 算法 | 速度 | 压缩率 | 适合场景 |
|---|---|---|---|
| XPRESS4K | 最快 | 最低 | 对速度最敏感的场景,比如频繁加载的游戏资源 |
| XPRESS8K | 较快 | 中等 | 日常使用的均衡选择 |
| XPRESS16K | 中等 | 较高 | 大多数程序目录的最佳选择 |
| LZX | 最慢 | 最高 | 冷数据、归档、不常修改的大文件 |
如果你不想纠结,一个简单原则:大部分程序目录用 XPRESS16K,下载归档和冷数据用 LZX。
动手操作:命令行篇
操作前建议:如果是第一次尝试,先创建一个系统还原点,或者确保有可用的备份。WOF 压缩本身是安全的,但养成”操作前留后路”的习惯总没错。
压缩一个目录
打开管理员命令提示符或 PowerShell,假设你要压缩 Autodesk 的安装目录:
compact /c /a /i /f /exe:XPRESS16K /s:"C:\Program Files\Autodesk"参数解释:
/c— 执行压缩/a— 包含隐藏和系统属性文件(查询时则显示压缩比信息)/i— 出错时继续/f— 强制压缩已压缩文件/exe:XPRESS16K— 使用 WOF /EXE 压缩,算法选 XPRESS16K/s:路径— 递归处理指定目录及所有子目录
如果要压缩下载归档目录,可以换成 LZX:
compact /c /a /i /f /exe:LZX /s:"D:\Downloads\Archive"查看压缩状态
用 /a 参数可以看到文件是否被压缩以及压缩比:
compact /a "C:\Program Files\Autodesk\*"输出会显示每个文件的原始大小和压缩后大小,以及压缩比。
解除压缩
如果以后想恢复:
compact /u /a /i /f /exe /s:"C:\Program Files\Autodesk"
compact /u /a /i /f /s:"C:\Program Files\Autodesk"第一行解除 WOF 压缩,第二行解除传统 NTFS 压缩。两行都跑一遍最保险。
压缩系统文件(官方方式)
先看看系统当前状态——很多 Windows 10⁄11 设备出厂时就已经处于 CompactOS 状态了:
compact /CompactOS:query如果返回”Compact state”,说明系统已经在用受控压缩了,不需要额外操作。如果返回”non-Compact”而你确实想压缩系统文件,可以执行:
compact /CompactOS:always这是受控的系统压缩模式,Windows 自己决定哪些文件该压、怎么压,启动链完全兼容。想恢复的话:
compact /CompactOS:never查看当前状态:
compact /CompactOS:query不想敲命令?GUI 工具推荐
对于不习惯命令行的用户,有两个不错的图形界面工具:
CompactGUI
开源工具,GitHub 上可以直接下载。它的原理就是调用 Windows 原生的 WOF API,做的事情和 compact /EXE 完全一样,只是提供了一个可视化界面。你可以选择目录、选择算法、一键压缩,还能看到压缩前后的空间对比。
项目地址:github.com/IridiumIO/CompactGUI
Compactor
另一个开源的命令行 GUI 工具,支持按目录批量压缩,也有排除列表功能。
项目地址:github.com/Freaky/Compactor
用 GUI 工具的好处是所见即所得——你可以先看看每个目录有多大、压缩后能省多少,再决定要不要压。
最值得压缩的目录
根据实测经验,以下类型的目录压缩收益最大:
专业软件资源目录
这些目录通常包含大量 XML、JSON、模板、帮助文档、语言包、插件资源,单个文件小但数量极多,WOF 压缩效果很好。
C:\Program Files\Autodesk
C:\Program Files\Siemens
C:\Program Files\SOLIDWORKS Corp
C:\Program Files\Unity
C:\Program Files\Adobe开发工具链和包缓存
Python 包、Node 包、Java 包缓存这类东西基本不怎么改,但占空间非常夸张:
C:\ProgramData\anaconda3
C:\Users\<User>\.gradle
C:\Users\<User>\.nuget
C:\Users\<User>\.m2
C:\Users\<User>\AppData\Local\pip
C:\Users\<User>\AppData\Local\npm-cache
C:\Users\<User>\AppData\Roaming\npmSDK 和文档
C:\Program Files (x86)\Windows Kits
C:\Program Files (x86)\Microsoft SDKs
C:\Program Files (x86)\STM32Cube下载归档和冷数据
这些不常用的文件适合用 LZX 算法压一压,反正也不影响日常使用:
D:\Downloads\Archive
E:\Backup游戏资源(适度使用)
一些大型游戏的资源文件也可以压,但注意:如果游戏使用了 DirectStorage(Windows 11 上的新特性),WOF 压缩可能会和 DirectStorage 冲突,建议跳过。
不建议压缩的目录
有些东西压了不但没收益,还可能出问题:
C:\Windows ← 用官方 CompactOS,不要手动递归
C:\Boot
C:\Recovery
C:\System Volume Information
EFI 分区
WinRE 分区关于 C:\Windows 的压缩,只用 compact /CompactOS:always 这一个入口。不要手动对它执行 /EXE 递归压缩,具体原因后面会说。
另外,已经被压缩过的文件(视频、照片、zip/7z/rar、iso、dmg、exe/msi 安装包)再压基本是白费力气,压缩率通常不到 5%。
性能影响到底有多大
这是很多人最关心的问题:压了以后电脑会不会变慢?
简短的回答:大部分场景下感知不到差异。
详细一点说:
WOF 压缩的原理是用 CPU 解码来换取磁盘读取量减少。对于 XPRESS4K/8K/16K 这类算法,解码开销非常小(微秒级),而 NVMe SSD 的读取速度本来就有富余,所以综合下来通常是持平甚至略快——因为要读的字节数变少了。
LZX 的解码开销相对大一些,但对于不频繁访问的冷数据来说完全可以接受。
对于高性能配置(比如 i7-13700H + Samsung 990 Pro 这种级别),压缩系统文件带来的收益主要是省空间,而不是性能优化。事实上,压缩的额外 CPU 解码开销在某些极端场景下还可能略微拖慢读取。所以这纯粹是一个”用 CPU 换硬盘”的交易。
总结:日常使用选 XPRESS16K 完全没问题,冷数据选 LZX 也没问题,不用太担心性能。
另外一个常见疑问:压了以后 Windows Update 会不会出问题?答案是不会。CompactOS 状态下 Windows 更新正常工作,微软文档明确说更新可以按需替换或移除被压缩的文件。用 /EXE 压缩的程序目录也一样——更新时如果文件被修改,会自动退回非压缩状态,不会阻塞更新流程。
操作建议:从小范围开始
如果你第一次接触这个功能,建议不要上来就全盘递归。先挑一个目录试试:
compact /c /a /i /f /exe:XPRESS16K /s:"C:\ProgramData\anaconda3"看看压缩前后的空间变化、使用有没有异常。确认没问题了再逐步扩大范围。
如果写自动化脚本,建议用白名单 + 排除列表的方式,而不是从盘符根目录直接递归。一个简单的框架:
# 排除列表:绝对不要碰的目录
$excludePrefixes = @(
'C:\Windows',
'C:\Boot',
'C:\Recovery',
'C:\System Volume Information'
)
# 白名单:你确认要压缩的目录
$targets = @(
'C:\Program Files\Autodesk',
'C:\Program Files\Siemens',
'C:\ProgramData\anaconda3'
)
foreach ($dir in $targets) {
$skip = $excludePrefixes | Where-Object { $dir.StartsWith($_) }
if ($skip) {
Write-Host "跳过: $dir (命中排除规则)" -ForegroundColor Yellow
} else {
Write-Host "压缩: $dir" -ForegroundColor Green
compact /c /a /i /f /exe:XPRESS16K /s:$dir
}
}策略虽然麻烦一点,但边界可控。
最后一个提醒:知心踩过的那个坑
说了这么多好处,必须讲一个真实的教训。
我曾经因为系统盘空间吃紧,用 compact.exe /EXE:XPRESS16K 对整块 C 盘做了递归压缩——包括 C:\Windows。压缩完 Windows 当时还能正常跑,桌面、软件、文件访问全都没异常。看起来成功了。
然后重启了。
机器直接进了 Windows 启动修复,反复失败,强制关机再开机也一样。最后把系统盘挂到另一台机器上做离线检查,发现 C:\Windows 里 551 个 .sys 驱动全部被 WOF 压缩了——包括 ntoskrnl.exe、hal.dll、ntfs.sys、disk.sys、wof.sys 等启动链最底层的文件。
核心问题是:运行中的 Windows 已经加载了 WOF 过滤器,所以压缩完当时能正常读取。但重启后,早期启动环境还没有加载 WOF 过滤器,就已经需要读取那些被压缩的文件了。结果就是——启动链断了。
幸运的是,文件本体还在,只是被压了。用另一台 Windows 离线执行 compact /u /exe 把 Windows 目录解压回来,系统就恢复了启动,没有重装。
一句话总结教训:
新式压缩很好用,CompactOS 也确实能稳定压缩 Windows。危险的是把普通文件清理思路套到 C:\Windows 上,手动递归压缩整个启动链。关于这次翻车的完整排查过程、技术原理分析和修复步骤,我另外写了一篇详细的复盘文章~如果你也遇到了类似问题,那篇文章可能对你有帮助。
总结
WOF 新式压缩是 Windows 里一个被严重低估的功能。对于那些装满了专业软件、开发工具链、包缓存和冷数据的系统盘来说,它能回收非常可观的空间,而且对日常使用性能几乎没有感知。
只要记住三条原则:
- 数据目录大胆压,系统目录用官方入口。 程序资源、SDK、包缓存、归档放心用
/EXE,C:\Windows只用CompactOS:always。 - XPRESS16K 是万金油,冷数据用 LZX。 不用纠结算法选择。
- 从小范围开始,确认没问题再扩大。 不要上来就全盘递归。
你的 C 盘可能真的还能抢救一下。