"假如程序是通过文件名与某个 DLL 建立链接,那么文件名变了的话,程序就找不到它了。

"说这话的是微软资深员工 Raymond Chen,他试图解释的谜题是:为什么到了 2026 年的 Win11 26H2,System32 文件夹里依然躺着 kernel32.dll、user32.dll、ntoskrnl.exe 这些看起来像上世纪 80 年代产物、严格遵守 8.3 命名规范的核心系统文件。

打开网易新闻 查看精彩图片

Windows 11系统官方标识界面

所谓 8.3 规范,是 MS-DOS 时代留下的化石:文件名主体最多 8 个字符,扩展名最多 3 个,只能使用 ASCII 字符,不能有空格,句号也只能出现一次。

NTFS 普及后长文件名早已是主流,但 Windows 在创建长文件名时默认仍会在后台同步生成一个带波浪号的短别名——比如 longfilename.txt 自动生成 LONGFI~1.TXT。在 WindowsApps 等目录里,这种带波浪号的短名称至今随处可见。

打开网易新闻 查看精彩图片

Windows系统8.3文件名别名机制演示示意

金字塔底座的裂缝

微软保留这套老机制,代价不是零。当单个目录下的文件数量达到数万甚至数十万时,系统每次写入都要重复计算并检查短文件名是否重复,造成明显的 I/O 开销。

戴尔在 Avamar 备份软件测试中记录到,启用 8.3 文件名后,含百万级文件的文件夹处理约 130 万个文件时性能停滞;禁用后,两至三小时内可创建超 500 万个文件。性能提升如此显著,以至于网上出现了教用户用 fsutil 8dot3name set 命令关闭该功能的教程。

打开网易新闻 查看精彩图片

就在近期,微软接连发布警告,呼吁用户和系统管理员不要跟风停用。官方列出的风险清单相当具体:许多企业级软件、旧版安装程序、杀毒工具或年代较久的驱动程序,内部架构仍然依赖 8.3 格式路径。

一旦系统全面停用,可能导致应用程序无法运行、注册表和服务报错,极端情况下触发特定系统模块异常,引发蓝屏或系统故障。微软还特别提醒,直接剥离既有 8.3 名称而不处理依赖项,可能导致软件卸载失败。

链接一旦断了,程序就找不到回家的路

Raymond Chen 那句解释指向的正是 Windows 运行机制的底层逻辑:程序依赖的往往不是文件本身,而是文件的名字。如果一个老程序通过文件名与某个 DLL 建立硬链接,系统为它生成的长路径一旦失效——别名被剥离、命名规则被改动——程序就彻底找不到它了。

这种依赖关系蔓延到系统深处。微软要求,在存有百万级别文件的服务器端 NTFS 目录环境中,管理员关闭 8.3 别名机制前必须验证所有运行的自动化脚本均不依赖短文件名。由 8.3 机制引发的兼容问题不止于 DLL。

微软官方文档重申,在 Windows 10/11 系统中若直接剥离既有 8.3 短名称而未处理对应依赖项,可能导致软件卸载失败等兼容性问题。动一个文件名看似小事,牵扯到的却是注册表、服务配置和安装程序的一整套引用关系。

对普通用户而言,微软的建议是根本不需要动这项设置——关闭短文件名带来的兼容性风险远高于感知到的性能提升。

为什么 40 年没改

这些问题引向一个更深的疑问:为什么固定死 8 个字符和 3 个字符,而不是在 1990 年代直接扩展规范、把旧程序一次性迁移过来?Raymond Chen 给出的解释分两层。

第一层是规则来源:8.3 命名规则继承自 CP/M,但 CP/M 为什么选中这两个数字,连他本人也不清楚——CP/M 的目录格式中存在两个保留字节,理论上文件名长度当时就可以扩展至 10.3。

第二层是迁移成本:到了 Windows 95,微软也没有要求系统驱动器必须支持长文件名,部分原因是使用漫游配置文件的企业可能依赖无法处理长文件名的服务器。直到 WinXP,长文件名才成为必需条件。

文件名兼容的复杂度在微软自家的安装程序逻辑里暴露无遗:Windows 可以为每个长文件名生成短文件别名,如果安装程序要将 shellstyle.dll 复制到一个已经存在 shellstuff.dll 的文件夹中,新文件很可能会被命名为 SHELLS~2.DLL。

这种自动生成的机制,恰恰说明 8.3 机制不是一条可以随意抽掉的旧骨——它嵌在 Windows 的运行骨架里,与系统加载、程序安装的每一个环节咬合。Windows 至今默认不分大小写处理文件,也是因为 MS-DOS 以大写形式显示文件名的遗留习惯。

而微软给出的根本不是二选一的答案。对普通用户,保留开箱即用的默认状态;对确实有极高 I/O 吞吐需求且存有海量文件的服务器环境,微软也承认禁用是合理选择——条件是做全面兼容性测试,确认该磁盘分区上运行的所有软件和自动化脚本都已经完全不依赖短文件名。

再回头看 Raymond Chen 那番话,它说的不只是 DLL 链接的技术细节,而是一个更笨拙的事实:Windows 系统核心文件至今沿用 8.3 命名,不是微软不记得改,是它不敢改——改动一个文件名,等于要求几十年间写下的每一行依赖它的代码全部挪窝。

在大型企业环境里,那意味着重新验证成千上万个程序和脚本,成本高到微软选择让三个字符的扩展名和八字符的主文件名继续蹲在 System32 文件夹里,再撑过一代 Windows。