为什么 Windows 会在 C 盘重复存放这么多的安装包,占用这么多磁盘空间?

2018-09-08 20:18:31 +08:00
 shijingshijing

以前就发现从 Win7 开始,微软会在安装文件的时候把安装包保存在 C 盘用 UUID 命名的某个文件夹下,Stackoverflow 和 Microsoft Community 上面也有人讨论过这个问题,结论是不删。好,那就让你存吧。

现在发现这货还会重复保存。

用小工具扫了一下,占了加起来差不多 10 个多 G 的空间,对于 SSD 来说,可不少了。特别是装了 Visual Studio 2015 以后的版本,明显感觉膨胀了不少。VS 2010 其实都还好。

这几个位置是重灾区: C:\ProgramData\Package Cache
C:\Users\All Users\Package Cache
C:\Windows\Installer\

在 C:\Windows\Installer\下保存的是重命名后的安装文件,经过二进制对比,其实跟安装程序使用的安装文件是一模一样的。

微软能不能上点心啊,v2 上的微软员工能不能内部提一下这种低级的问题。

9232 次点击
所在节点    程序员
58 条回复
geelaw
2018-09-09 05:41:16 +08:00
@kerr92 #5 @reus #7 无知的典型,大放厥词

首先 C:\Users\All Users 就是 C:\ProgramData,这是一个 NTFS junction,出于兼容性目的存在的,为的是让一些(古早味)程序访问 All Users 的时候不会找不着北。

接下来看 C:\Windows\Installer 和 C:\ProgramData\Package Cache。在我的电脑上,我自己分析了一下:

# 获得所有的 hash
$WindowsInstaller = Get-ChildItem C:\Windows\Installer -File -Recurse -Force | Get-FileHash
$ProgDataPkgCache = Get-ChildItem 'C:\ProgramData\Package Cache' -File -Recurse -Force | Get-FileHash

# 查看文件夹自重复
$WinInstSelfDup = $WindowsInstaller | Group-Object Hash | Where-Object Count -gt 1

# 我这里看到重复的文件都只重复了一次
$WinInstSelfDup | Out-Host;

# 查看重复文件的大小(每组算一次)
$WinInstSelfDup | ForEach-Object { Get-Item $_.Group[0].Path } | Select-Object -ExpandProperty Length | Measure-Object -Sum | ForEach-Object { $_.Sum / 1MB }

# 我这里不到 2MB

# ProgramData\Package Cache 里面的文件自己重复大小是 2-3 次
# 重复文件(每组一次)不到 9 MB

# 接着我们分析两个文件夹之间的重复文件
$WindowsInstaller | Where-Object { $ProgDataPkgCache | Where-Object Hash -eq $_.Hash | Measure-Object | Select-Object -ExpandProperty Count } | ForEach-Object { Get-Item $_.Path } | Select-Object -ExpandProperty length | Measure-Object -Sum

# 上述命令输出两个文件夹之间重复的文件大小(只算 Windows\Installer 里面出现的次数)
# 不到 60MB

我觉得这应该不算是什么问题。我的电脑安装了如下软件:7-Zip, Adobe Reader CC, iTunes, Git for Windows, Image Composite Editor, Office 365 Home, Visual Studio 2017 Community (Managed Desktop, Native Desktop, UWP), Pulse Secure, SourceTree, MiKTeX.

此外,可以用 fsutil 验证上述两个文件夹里的文件不互为 hard link。

@shijingshijing #8 MSI 安装包不总是可用,例如它存在于可移动介质或者是 on-demand 来自网络。

这些文件也不是所有的东西的完整安装包,因为在我的电脑上两个文件夹一共才 1300 MB 左右,根本不可能容纳我安装的那些软件。
kerr92
2018-09-09 08:13:03 +08:00
@geelaw 不对之处请谅解😁印象里见过不止轮子哥一人称赞微软硬盘容量大的福利。
xuanbg
2018-09-09 08:51:10 +08:00
@shijingshijing Linux 也会产生很多垃圾文件。。。同样很难删除。。。这个问题不是操作系统的锅,而是应用软件的锅。
reus
2018-09-09 10:32:01 +08:00
你看,软粉一洗就只有几十兆了,多干净啊。十几个 G ?不存在的!楼主还不升级 SSD ?小心他们说你大放厥词!
krixaar
2018-09-09 11:52:04 +08:00
@reus 但是 C:\ProgramData\Package Cache 和 C:\Users\All Users\Package Cache 确实是同一个地方,开个 cmd,cd 到 C:\Users,用 dir /A:L 回车可以看到是链接,所以这两个位置不存在重复一说,能看到两个,只占一份空间。
shijingshijing
2018-09-09 12:04:02 +08:00
@geelaw
@krixaar

刚看了一下,确实是 SYMLINKD

C:\Users>dir /aL
驱动器 C 中的卷是 Win7
卷的序列号是 0000-FFFF

C:\Users 的目录

2009/07/14 13:08 <SYMLINKD> All Users [C:\ProgramData]
2009/07/14 13:08 <JUNCTION> Default User [C:\Users\Default]
0 个文件 0 字节
2 个目录 1,160,388,608 可用字节
rainex
2018-09-09 12:57:06 +08:00
软件的锅,跟系统关系不大,osx 里系统自带的卸载方式基本都不管垃圾文件的,一样是系统越来越臃肿,linux 也是
CRVV
2018-09-09 13:20:06 +08:00
@geelaw

在我的机器上
Windows/Installer 27.4 GiB
ProgramData 7.58 GiB

ProgramData 和 Windows/Installer 里重复的文件,每个文件只算一次,一共有 1.5 GiB

重复次数最多的是 /c/ProgramData/Microsoft/Search/Data/Applications/Windows/GatherLogs/SystemIndex/SystemIndex.12.Crwl,79 次,不过这个文件只有 2 bytes

大于 100 MiB 的文件有 3 个,全是微软家的东西,一共 440 MiB

14903790e1237de08c6243db5de6e062bf3867561212b0baa8a8812bc3697fdf 150634496 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetPackages.Msi,version=1.0.20124.0/AspNetWebToolsPackagesVS15_ENU.msi
14903790e1237de08c6243db5de6e062bf3867561212b0baa8a8812bc3697fdf 150634496 /c/Windows/Installer/4a6ef0.msi

3675b2e23df6b639dba1706ae0b969df1e1b359d25c8ed770401430d58807358 160104448 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetCoreLocalFeed.1.1.Msi,version=15.0.11421.0/AspNetCoreLocalFeed_1_1_VS15_ENU.msi
3675b2e23df6b639dba1706ae0b969df1e1b359d25c8ed770401430d58807358 160104448 /c/Windows/Installer/4a6f41.msi

9ac20c0e94ca5c22388d710e0ff4f11576ff420cded1866b9bcd1a9cca74e026 123056128 /c/ProgramData/Microsoft/VisualStudio/Packages/Microsoft.VisualStudio.AspNetCoreLocalFeed.Msi,version=15.0.11421.0/AspNetCoreLocalFeedVS15_ENU.msi
9ac20c0e94ca5c22388d710e0ff4f11576ff420cded1866b9bcd1a9cca74e026 123056128 /c/Windows/Installer/4a6f3a.msi

还有一个 WinSxS 也是类似的情况,越用越大,据说不能删
更扯的是 Windows 还经常到一个盘的根目录下面创建一大堆临时文件不删
https://social.technet.microsoft.com/Forums/ie/en-US/b65af122-f4db-4053-a22d-f2b1081cc01e/windows-update-temporary-folder-location?forum=winserverwsus
2010 年就有人提了,我在最近 30 天之内还遇到过

Windows 特别喜欢搞一大堆不知道有没有用的文件存着,这种事情大家都早就知道了,其实没什么可辩解的
wenzhen
2018-09-09 13:26:27 +08:00
@RainyH2O 前段时间好像看到 steam 在 Linux 平台上已经支持部分游戏了。
reus
2018-09-09 13:29:38 +08:00
@krixaar 重复不重复是其次,占空间越来越大,这才是问题。linux 不断增大的只有日志文件,没见过安装包还需要留着不能删除的。磁盘读写量还明显比旧版的高得多,虽然 SSD 快,但 SSD 也有读写寿命的,我就不明白每次开机写入的那堆究竟是什么东西。
geelaw
2018-09-09 13:49:17 +08:00
@CRVV WinSxS 里面一些文件和 Windows 以及 System32 和 SysWoW64 里面是硬链接关系,见 https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/determine-the-actual-size-of-the-winsxs-folder

Windows 10 会自己删除没有用的 WinSxS 文件,见 https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/clean-up-the-winsxs-folder

至于“不知道有用没用”的原因,是因为不知道用户未来的需要( Windows 不能预测未来),而不是本身是否知道。

你最后提到的那个帖子的问题是 Windows 的更新安装器最后留下了不含内容的文件夹,而不是留下了有内容的临时文件,是两个不同的问题。此外,那个帖子的重点并不是占用空间的问题,而是安全和速度问题(帖子主人提到 server 的最大剩余空间 volume 很可能是 Storage Area Network 或者非 NTFS 格式的分区)。

对于 VS,你可以通过 https://blogs.msdn.microsoft.com/heaths/2017/04/19/cleaning-up-the-visual-studio-2017-package-cache/ 提到的方法删除 cache,但是这将失去离线修复 VS 组件的功能。

你的 Installer 文件夹大得有些离谱了,根据 https://blogs.msdn.microsoft.com/heaths/2005/11/29/windows-installer-cache/ 这个文件夹里是不包括很多信息的( cabinet streams are stripped ),应该调查是否是你安装的程序的 MSI 编写方法有问题。
ysc3839
2018-09-09 13:53:01 +08:00
@rainex macOS 下大部分软件没有“卸载”这个操作,“安装”只是解压,“卸载”只是删除,系统自然不会处理程序产生的文件。
macOS 系统的 pkg 安装包也没有卸载操作。
有卸载操作的只有那种使用自己的安装 /卸载程序的软件。
geelaw
2018-09-09 13:53:15 +08:00
@reus #30 That wouldn't make sense for me. 因为 Windows 的日志默认都是有限额的。而且这个问题和 Linux 还是 Windows 没关系。如果你需要卸载和更新软件,总是需要存储关于安装的信息的。

如果您不能读懂重复文件的大小和总大小的区别,我觉得您不适合考虑安装信息占了多少空间的问题的。
janus77
2018-09-09 16:02:38 +08:00
@anonymous256 #10 我只有 600m ……
msg7086
2018-09-09 16:54:16 +08:00
@reus 「没见过安装包还需要留着不能删除的。」
你可能没听说过 ArchLinux→_→
alvin666
2018-09-09 16:58:54 +08:00
还有更恶心的驱动...老驱动得借助第三方软件+管理员权限才能删,你说为了备份也就算了吧,一个驱动保存三四个版本我很服气,尤其是 nv 家驱动一个几百 m
gnaggnoyil
2018-09-09 17:26:32 +08:00
@msg7086 `pacman -S pacman-contrib & paccache -rk 0`
zwh2698
2018-09-09 17:36:03 +08:00
Office 还内置游戏呢
gnaggnoyil
2018-09-09 17:39:07 +08:00
当然我得废话一句 pacman 的 cache 中的安装包都是很有用的,特别是在要滚回到之前的版本的时候.Windows 中的安装包同理.我这边 VS2017+MS Office 2016 全家桶的情况下 Package Cache 和 Installer 也不过 1.3GB,所以至少对我而言只要定期清理 windows.edb 就没什么空间不足的问题的……
fengleidongxi
2018-09-09 17:49:06 +08:00
关闭 update 应该能解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/487452

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX