为什么全世界的 Windows 电脑,都建不出一个叫 con 的文件夹

你可以现在就在手边的 Windows 电脑上做一个实验。

不管是最新的 Windows 11,还是二十年前的 Windows XP。

在桌面上点右键,新建一个文件夹。

把名字改成 con,按回车。

系统会立刻弹出一个毫无由头的错误提示,说「指定的设备名无效」,然后强行把名字退回「新建文件夹」。

你不信邪,换成大写的 CON,不行。

加个后缀叫 con.txtcon.png,还是不行。

甚至在命令提示符里敲 mkdir con,它依然冷冷地回你一句系统找不到指定文件。

不仅是 con。如果你去试 prnauxnul,或者 com1lpt1,会发现它们全都被系统拉进了黑名单。

刚学电脑那会儿,很多人以为这是微软留的什么秘密后门,或者某个高深莫测的内核安全机制。

甚至早年贴吧里还流传过一个谣言,说比尔·盖茨小时候外号叫 con,他觉得被羞辱了,所以不准 Windows 出现这个词。

其实全想多了。

这扇被焊死了五十年的大门背后,压根没有什么安全哲学,也没有什么首富恩怨。

它纯粹是 1974 年一个为了省事的偷懒设计,被微软一路当成祖传包袱,供奉到了今天。

事情得从五十二年前讲起。

1974 年,计算机先驱加里·基尔代尔写出了微机历史上第一个真正意义上的操作系统,CP/M。

当时的电脑长得像个大铁箱子,没有图形界面,没有鼠标,甚至连硬盘都没有。

程序员想写程序,得靠键盘输入代码,想看输出,就得连一台嗡嗡作响的物理针式打印机。

加里·基尔代尔想了一个很讨巧的办法,他把所有连接到电脑上的硬件,全都虚拟成了一个个名字。

键盘和屏幕合起来叫控制台,缩写成 CON,也就是 Console。

物理打印机叫 PRN,也就是 Printer。

串口通信叫 AUX,也就是 Auxiliary。

黑洞丢弃设备叫 NUL,也就是 Null。

这么做有什么好处呢。

当时的操作极其朴素,程序员如果想把一段话打印出来,不需要专门写一套复杂的打印驱动程序。

他只需要在命令行里敲一句 copy memo.txt prn

系统看到目标是 PRN,就会自动把这篇文本的所有字节,原封不动地推给针式打印机。

如果你想新建一个文本文件,敲一句 copy con test.txt,接着你在键盘上敲的每一个字,就会被实时抓取并存进文件里。

在那个连文件系统都处于石器时代的年代,这套设计确实很聪明。

但问题在于,当时的 CP/M 是一维平面的,整个软盘里只有一层文件,压根就没有「文件夹」或者「子目录」的概念。

加里·基尔代尔在底层写判断逻辑的时候,压根不需要考虑路径。只要输入的字符串匹配到 CONPRN,系统直接就把它当成物理硬件给拦截了。

转折点发生在 1981 年。

微软接了 IBM 的大单,要给 IBM PC 配一套操作系统。

比尔·盖茨和蒂姆·帕特森在赶工 MS-DOS 1.0 的时候,基本全盘继承了 CP/M 的这套 API 和设备命名习惯。

到了 1983 年,微软发布 MS-DOS 2.0。

这时候计算机终于有了子目录,也就是我们今天熟悉的层级文件夹 C:\work\project\

微软的工程师在重写文件系统解析器时,面临了一个选择。

这些从 1974 年继承过来的古老设备名,到底该怎么处理。

按理说,最严谨的做法是做作用域隔离,只有在根目录下或者特定的硬件命名空间里,CONPRN 才代表硬件,在普通的子文件夹里,用户爱叫什么就叫什么。

但当年的工程师赶着交付,做了一个极其省事的决定。

他们在文件系统解析的最顶层,直接写死了一段硬编码规则,无论用户在哪个盘符、哪一层子目录下输入路径,只要文件名剥掉后缀后等于 CONPRNAUXNUL,系统就无条件把它劫持为硬件设备。

也就是说,在系统眼里,C:\games\con.txt 根本不是一个文本文件,而是你面前的键盘和屏幕。

这一行五分钟写出来的偷懒逻辑,给后来的 Windows 埋下了一个长达半个世纪的超级大坑。

时间来到 1993 年,微软开始做划时代的 Windows NT。

这套系统拥有全新的 32 位架构,彻底抛弃了古老的 DOS 内核。

按理说,这是把这个历史烂摊子打扫干净的最佳时机。

但微软著名的内核架构师 Raymond Chen 后来在技术博客里透露,他们当时根本不敢删。

因为在九十年代,全世界的大银行、工厂、航空公司和政府机构里,跑着海量用 C 语言或者 Basic 写的古董商业软件。

很多老银行系统的打印模块,代码里依然写着向 C:\TEMP\PRN 输出发票。

如果 Windows NT 允许用户在目录下新建一个叫 prn 的正常文件夹,这些价值几十亿美元的商业软件一旦运行,原本该送到物理打印机的账单数据,就会被悄悄写进这个文件夹里,打印机当场哑火。

为了让全世界的老企业能毫无痛感地升级系统,微软只能选择继续妥协。

他们在全新的 NT 内核文件子系统里,继续把这几个七十年代的设备名原封不动地保护了起来。

这一保护,就保到了 Windows 11。

今天你用着几十个核心的 64 位处理器,挂着几十 TB 的固态硬盘,点右键依然建不出一个叫 con 的文件夹。

不是现代技术解决不了一个三个字母的名字。

而是半个世纪前,有人在一台只有几十 KB 内存的电脑上随手写下的一行代码,借着兼容性的名义,跨越了五十年光阴,依然在管着今天几十亿台现代电脑。

很多时候我们在电脑里遇到的那些莫名其妙的规矩,别急着脑补有多深刻的大道理。

往回扒几十年,往往只是当年某位祖师爷为了赶在下班前交差,随手打的一个补丁而已。

署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
位旅人路过 次翻阅 初次见面