我发现这可能是一个非常典型的关于微信存储被误解的问题,尤其是还算懂一点点技术的网友,就更会不加思索,以讹传讹,然后误导更多人。
微博网友给我的留言,微信公众号收到的留言,都有不少人提到这个问题,既然这么典型,那就有必要说一下这个经典的微信「文件重复存储多份」的问题。
类似的问题,我以前其实写过科普文做过说明,不过时间久了,我早就忘了,而且这次又稍微有点不同。
网友典型的疑问是这样的:微信为什么傻乎乎的一个文件存储多份?难道他们不知道校验一下文件 MD5 吗?发现重复就不要存了嘛。
咦,你说,如果普通网友都能明白这么简单的问题,微信那帮开发的同学能傻到不知道吗?这不符合常理吧?
有人补刀说:我有证据。贴出类似图一的信息,说:你看,我转发一个文件到不同的群,然后呢,你看,操作系统里就出来了多个重复的文件。
算不算有图有真相?
我相信,这时候,如果这位朋友去检查一下每个文件的详细大小,会发现他们文件大小也是一样的。
你看,这难道还不是重复存储了?连证明图都拿出来了,你服不服?
眼见,不一定为实。 眼见,不一定为实。 眼见,不一定为实。
我问微信的开发团队,你们咋回事啊,还打算要年终奖了不?之前没有重复存储文件,这难道后续的版本引入了新的 Bug?
还真没有重复存储。
微信在 Windows 上的实现,是通过「硬链接」(Hard Link) 的机制。其实只要对操作系统知识有基础的网友,一看到「硬链接」这个关键词,可能就会恍然大悟。但也不是全部,很多科班毕业的网友居然也没思考过这个问题,还继续硬杠。
但是,毕竟,99.99% 的网友没有一点操作系统(OS)的基本概念。
那么,怎么证明这些不同名字的文件其实是同一个文件呢?现在 Windows 系统自带一个命令行工具,叫 fsutil,用这个命令行工具探测一下这几个不同名字的文件,会发现文件 ID 是相同的。如果是不同的文件,文件 ID(File ID)是不同的。
背景知识:创建一个已有文件的硬链接,并不占用双倍的物理存储空间。尽管,你查看这个新创建的文件大小,和原文件一样大。
补充,Android 上实现机制并不一样。但是 iOS / macOS / Windows 是类似的。
但是略懂一点技术的人可能还会提问:我记得操作系统里有软链接(Soft Link) 的啊,微信存储重复文件为啥不用软链接?
这题我会。
答:如果用软链接的话,万一这第一份文件删除了,后面的文件就都不可访问了。
到这里我可以做一下基本结论:
网友所认为的「微信为什么傻乎乎的同一个文件存储多份」其实是一种误解。微信在这地方的技术实现并没有太大问题。
但是,吹毛求疵一点的说,微信开发团队的同学依然有一定责任。为什么这么说呢?既然,你用的是硬链接的方式,那么,文件名字能不能不要太随意,如果新创建的文件加上一个后缀,比如:
  • 测试.txt 
  • 测试_lnk0.txt 
  • 测试_lnk1.txt
是不是就会让一些略懂技术的网友,增加一些了解呢?但这个细节,我就不懂实现起来有多复杂了。毕竟,众所周知,我曾经是个「不写代码的 CTO」……
继续阅读
阅读原文