Windows文件命名禁忌溯源,CON、PRN等保留名为何40年未改,连Win11核心文件仍用8.3规则

Windows至今禁止用户将文件或文件夹命名为CON、PRN、AUX、NUL及COM/LPT端口名,根源可追溯至1981年DOS 1.0;其8.3文件命名规则同样继承自更早的CP/M系统,微软因兼容性...

互联网/IT

在Windows 11 26H2中,用户可为文件设置长达255字符的名称,甚至混入空格与Emoji也无碍。但若尝试创建名为CON、PRN、AUX、NUL、COM1至COM9或LPT1至LPT9的文件或文件夹,系统会直接弹出“指定的设备名无效”错误——无论是否添加扩展名,如NUL.txt或COM3.log,均被同等拦截。

这一限制并非Windows独有,而是深植于操作系统底层逻辑。这些名称实为保留设备名(reserved device names),分别对应早期硬件接口:

  • CON 指向控制台(键盘输入与屏幕输出)
  • PRN 对应并行打印机端口
  • AUX 代表辅助串行设备(常用于调制解调器)
  • NUL 是空设备,所有写入操作均被丢弃
  • COM1–COM9 为串行通信端口
  • LPT1–LPT9 为并行打印端口

该规则最早出现在1981年的MS-DOS 1.0。当时DOS尚不支持子目录、小写字母,文件名严格遵循8.3格式(主名8字符+扩展名3字符)。而DOS对这些设备名的支持,实为向更早的操作系统CP/M(Control Program for Microcomputers)妥协的结果。

CP/M由Gary Kildall于1974年开发,是早期微型计算机主流系统。在CP/M中,设备通过带冒号的标识符调用,例如CON:、PRN:,语法上明确区分设备与普通文件。MS-DOS为实现兼容,将冒号设为可选——即允许仅用CON代替CON:,从而在不破坏旧程序的前提下完成迁移。

DOS 1.0时代仅有一个根目录,设备名与文件名不存在冲突:汇编器提示“输出存哪?”时,用户键入PRN即表示打印,NUL即丢弃,CON即显示于屏幕——逻辑清晰且无歧义。

问题出现在1983年DOS 2.0引入子目录之后。若保留名仅在根目录有效,当用户进入子目录运行程序并输入NUL时,系统将无法识别该设备路径,导致重定向失效。微软的解决方案是:让这些保留名在任意层级的目录中均生效。由此确立了沿用至今的全局保留机制——不仅根目录,任何文件夹内都不能使用上述名称。

  • 批处理中> NUL用于屏蔽命令输出
  • 脚本通过if exist foldername\nul判断目录是否存在(利用nul作为伪文件触发路径检查)
  • 旧教程教用户用copy CON filename交互式创建文本文件

一旦移除该规则,所有重定向至NUL的脚本将转而向磁盘写入真实文件,可能引发数据污染、权限异常乃至系统级故障。

更深层的兼容性体现在系统核心文件命名上。即便Windows 11已全面支持NTFS长文件名(最长255字符),其System32目录下的关键组件——如kernel32.dll、user32.dll、ntoskrnl.exe——仍严格采用8.3命名格式。

8.3规则本身亦源于CP/M。Raymond Chen在2009年指出,CP/M的目录结构预留了两个字节用于扩展,理论上可支持10.3格式,但开发者最终选择了8.3——他推测“8”只是一个方便的整数,无更深技术动因。

Windows沿用该格式的原因多重且现实:

第一,二进制兼容性刚性约束。DLL文件名是程序链接时的唯一标识,若微软将user32.dll更名为user32-windows-core.dll,数十年积累的第三方应用将全部因找不到入口点而崩溃。

Windows 11 System32目录截图,显示大量8.3格式系统文件

第二,企业环境依赖遗留配置。Windows 95时期,部分企业使用漫游用户配置文件,其后端服务器(如NetWare)不支持长文件名,迫使微软维持短名兼容。

第三,短名机制仍被主动使用。直至Windows XP时代,系统仍为每个长文件名自动生成8.3别名(如SHELLS~2.DLL),以应对安装程序冲突场景——当目标目录已存在shellstuff.dll,新文件shellstyle.dll会被映射为短名避免覆盖。

Chen在2007年总结道:“8.3命名的问题都已被充分理解并可控,换成长名只会带来一整套新问题。”修改kernel32.dll的代价远高于收益:它不会提升性能、增强安全性,反而可能触发难以预测的兼容性雪崩。

值得玩味的是,这种“历史包袱”并非微软独有。Unix/Linux系统同样保留/dev/null、/dev/tty等设备节点,虽路径不同,逻辑一致:将I/O抽象为文件是POSIX的核心设计哲学。区别在于,Linux允许在非/dev路径下创建同名普通文件(需绕过内核VFS检查),而Windows因NTFS与Win32 API深度耦合,选择全盘禁止以确保确定性。

回看Windows的演进路径,其对旧规则的坚守实为一种工程理性:在可用性与稳定性之间,优先保障后者。当用户抱怨“为什么不能叫CON.txt”,背后是数以亿计的脚本、驱动与企业系统在默默运行——删除一个保留名的成本,远高于容忍它四十余年。

如今,Windows 11的现代化界面与动画效果令人耳目一新,但深入System32目录,仍能看见1981年的幽灵:那些全大写的8.3文件名,与被禁用的NUL、COM1一起,构成了一座跨越四十余年的兼容性纪念碑。