当系统磁盘的空闲空间不断变小时,有很多第三方工具可以帮助我们「一目了然」地区分出大文件和小文件的集合。此时,你可能就会发现其中的一个另类——WinSxS 文件夹。这个文件夹通常为 5-10GB 左右大小,而它的存在对很多好奇以重的用户来说,它就像是 Windows 世界里的一个小黑屋。
自然而然,就产生了一个疑问,WinSxS 中装的那些文件到底是什么?为什么会占这么多硬盘空间?网络搜索和论坛上都有很多关于这个文件夹的问题。现在,就让系统极客带大家来解开 WinSxS 的秘密,以及管理它的正确方法。
WinSxS是什么文件夹
WinSxS(Side-by-Side)文件夹其实是微软为了解决 Windows 系统中的「DLL Hell」问题而创建的,「DLL Hell」简单一点来解释就是:如果某应用程序更改了一个动态链接库(DLL)文件,则会影响到使用同一 DLL 的应用程序关键功能的情况。
例如,应用程序 A 和 B 都调用同一个 DLL,而 A 需要的版本为 1.0.2,B 程序要用不同的版本,将其替换成了 1.0.3 版本。这样就势必会对应用 A 造成影响,要么出现兼容性问题,严重点甚至导致应用崩溃或蓝屏问题。
微软祭出WinSxS解决方案
从 Windows XP 系统开始,「组件存储」功能被正式启用,每个组件(包括 DLL、OCX 和 EXE)都会存储于这个被命名为 WinSxS 的目录中,这里会存放应用程序需要调用的不同版本 DLL,并根据需求加载正确的版本。
那问题又来了,一个应用程序如何知道它需要加载什么版本的 DLL 呢?这就需要「manifest」文件来发挥作用了,该文件包含了一些设置,用于告知操作系统在应用启动时如何处理,以及正确的 DLL 版本。
每个组件都带有唯一标识的名称,该名称可以包括:处理器架构、语言、版本和 ID,然后这些组件的特定版本被收集在一起,成为软件包,被 Windows Update 和 DISM 用来保持系统的最新状态。
WinSxS文件夹和硬链接
硬链接在整个 Windows 操作系统中都有广泛使用,就 WinSxS 而言,这是「组件」驻留在系统中的唯一位置,而「组件存储」之外的所有其他文件实例都是硬链接到 WinSxS 文件夹中的。
根据Microsoft Docs,硬链接是一种文件系统对象,它允许多个文件引用磁盘上的同一个位置。这意味着 Windows 可以在不占用任何额外空间的情况下,保留同一文件的多个副本。其实软、硬链接在 Windows、Linux 和 macOS 中都在被广泛使用。
当我们更新 Windows 系统时,如有新版本的「组件」发布,就会通过硬链接的方式将其映射到操作系统层面,而旧版本的「组件」依旧会保存在「组件存储」中,以确保可靠性(会取消硬链接),这样就可以在出问题时进行回滚。
为了证实这一点,我们可以来做一个小实验:
1 在「开始」菜单中搜索 cmd ——找到「命令提示符」——选择「以管理员身份运行」
2 例如,如果我要查看名为 audiosrv.dll 的系统文件的硬链接,就可以执行:
fsutil hardlink list "C:\Windows\System32\audiosrv.dll"
由此就以看出其在 WinSxS 组件存储中的映射路径。
WinSxS的重要性
WinSxS 组件存储的重要性不言而喻,它在支持自定义和更新 Windows 功能方面起着至关重要的作用,它可以帮助实现:
- 从引导失败或损坏中恢复系统
- 根据需要启用或禁用 Windows 功能
- 在不同的 Windows 版本之间升、降级系统
- 卸载有问题的更新
- 通过 Windows Update 来更新组件版本
WinSxS文件夹大小
Windows 系统的一大优势就在于它可以兼容一些较旧的硬件和应用程序,但这种兼容性是以占用磁盘空间和报错为代价的。而 WinSxS 组件存储中就包含了所有必要的文件,以维持住 PC 对硬件和软件的兼容性。
目测我系统中的 WinSxS 文件夹占用了 7GB 左右的磁盘空间,但由于「文件资源管理器」不考虑硬链接,这其实是一个虚值。
「文件资源管理器」和一些第三方应用会对硬链接的每个引用都视为单个实例, 因此,如果系统文件同时位于 WinSxS 和 System32 目录中,则文件资源管理器将错误地估算文件夹大小。
如何查看WinSxS文件夹的真实大小
1 在「开始」菜单中搜索 cmd ——找到「命令提示符」——选择「以管理员身份运行」
2 执行以下命令进行查看:
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
分析完成后,我们就可以看到「组件存储」的实际大小。
提示:/AnalyzeComponentStore 参数在 Windows 8 和更早版本中无法使用。
减小WinSxS文件夹大小的方法
很多用户经常会问,能不能手动删除 WinSxS 文件夹中的文件?甚至有人问能不能删除 WinSxS 文件夹?答案是——绝对不行!
如果你以这种搞事情的方式来删除其中的文件,很可能会损坏 Windows 功能,轻一点可能会让 Windows Update 无法正确安装、卸载更新,即便你成功地从 WinSxS 文件夹中删除了文件,也不知道是否哪个应用程序就会闹出幺蛾子。
但是我们可以通过 Windows 内置的一些工具,以专业而优雅的方式来减小 WinSxS 文件夹的大小,以达到网友们所期望的清理、压缩和瘦身等效果。
方法1:使用「磁盘清理」工具
1 在「开始」菜单中搜索 磁盘清理 ——找到并打开「磁盘清理」工具
2 在下拉列表中选择系统盘——点击「确定」——在打开的工具界面中点击「清理系统文件」按钮
3 勾选上所有对勾进行清理即可
方法2:移除一些不用的Windows功能
把一些普通用户不常用的 Windows 功能,如:Print to PDF、Hyper-V、PowerShell 和Windows 沙盒等功能给干掉,同样可以达到给 WinSxS 瘦身的效果:
1 使用 Windows + R 快捷键打开「运行」—— 执行 appwiz.cpl 打开添加删除程序
2 点击左侧的「启用或关闭 Windows 功能」
3.取消勾选不用的功能——点击「确定」按钮
方法3:使用DISM进行组件清理
其实从 Windows 8 开始,操作系统中就内置了一个自动执行 WinSxS 组件存储清理的任务计划。
在安装了更新的组件之后,该任务将至少等待 30 天,然后再卸载该组件的前一版本。该任务还有一个小时的超时时间,并且可能无法清理所有文件。
当然我们也可以手动使用 DISM 命令进行组件清理:
1 在「开始」菜单中搜索 cmd ——找到「命令提示符」——选择「以管理员身份运行」
2 手动执行以下命令:
DISM.exe /online /Cleanup-Image /StartComponentCleanup
使用 /Cleanup-Image 参数可以立即删除之前版本的组件,没有 30 天宽限期也没有一小时的超时限制。
DISM.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
增加 /ResetBase 参数可以删除每个组件的所有被取代版本,也将无法卸载任何当前的更新。
最后吐槽一下,微软将「Component Store」直译成「组件存储」我也是无语,叫「组件库」是不是更接地气一点。最最最后给大家推荐两篇相关文章:
- 如何压缩Windows 10系统磁盘,对系统进行减肥
- 腾出C盘又一方法,查看和清理 Windows 10「组件存储」
- 使用Windows 10内置工具释放硬盘空间的5种最佳方法