« 跟踪数据结构的变更 | 返回首页 | 绕过 c api 直接访问 lua 表 »

为什么 Windows 的文件系统会有盘符,使用反斜杠分割路径

今天同事在公司群里贴了张屏幕截图,上面有30+ 个盘。从 C: 排到 Z: , 然后还有 CC: CD: ,调侃问 Windows 能管理多少个盘。

图应该是 P 出来搞笑的,除去 A B 盘保留给已经淘汰的软驱用外,windows 超过 Z 盘后就不在能增加了。如果有更多储存设备,则需要用把设备挂接在空目录上(ntfs 支持)。

为什么 Windows 会有盘符这个诡异的东西呢?

按如非必要、勿增实体的原则,只用路径就够了呀。物理分区完全可以隐藏在文件系统之后,在 Unix 系的操作系统中,分区是用挂接点的方式挂接在虚拟文件系统中的(ntfs 其实也支持)。如果是为了方便记忆和保持用户习惯,完全可以把分区顺着挂接到 /c /d /e /f 下。如果你在 windows 下安装 mingw/msys 它就是这样处理 C 盘、D 盘 …… 的。

答案要从历史中找。

Windows 的前身是 微软的 Dos 系统。我见过的最古老的 MS Dos 是在我同学家的一台旧 IBM PC/XT 上。10M 的硬盘、只有 256K 内存,配置的系统是 PC(MS) Dos 2.0 。

知道这个 2.0 版的 Dos 比它的前身最大的改进是什么吗?它比 MS DOS 1.0 多支持了硬盘,以及层级目录结构。

同时期的主流电脑是 Apple ][ ,它的原生操作系统(Apple Dos)是不支持硬盘的,软盘上只有一个根目录。MS Dos 1.0 也一样。

除了 IBM PC,Apple ][ ,那个年代个人电脑品牌其实非常多。比如我的第一台电脑就是港产的 Z80 机器(laser 310 )。当时 8 位机上最流行的个人操作系统是一个叫做 CP/M 的系统。不过当时流行直接用汇编写程序,这个 CP/M 必须跑在 Z80(8080) 的指令集上。当年 Apple ][ 上流行过一种叫做 Z80 卡的扩展件,就是为了可以跑 CP/M 系统。

微软起家为 IBM 的 8086 系列 PC 写操作系统时,就借鉴了 CP/M 的一些东西,其中就有盘符这个东西。在没有硬盘,及内存小于软盘容量的年代,配置两个软盘驱动器是最方便的,所以就有了 A B 两个盘符(方便数据对拷)。每个文件都可以写成 A:FILENAME.EXT 的形式。这就是盘符的由来。

btw, 早年 IBM 想和 CP/M 合作没谈成,后来 PC 流行后,CP/M 又反回来兼容了 MS-DOS 跑在 PC 系统上,改名字叫 DR-DOS ,应该很多同学有印象。

MS DOS 发展到 2.0 时,由于 IBM 给 PC/XT 增加了 10M 的硬盘,所以盘符就被扩展到了 C: 表示硬盘。储存空间的增加导致了必须增加文件目录结构。可为啥微软选择了反斜杠,而不是 Unix 系列中已经很广泛的 / 呢?

这是因为,MS Dos 已有的很多命令行工具。当时微软做开发的人有 DEC 的背景,DEC 的操作系统上是用 / 做命令行参数分割符,而不是 Unix 系列用的 - ,就这样沿用到了 MS Dos 里。btw, 我读大学时第一次接触 Linux ,感觉输入最不习惯的就是用 - 而不是 / 。

为了防止混淆,目录风格符就不能再使用 / 了,DEC 系统中用的是点 "." ,可 MS Dos 学了 CP/M 用 . 做文件后缀名分割,所以就用了让后代程序员深恶痛绝的反斜杠 \ 。

ps. C 系列的语言中,\ 是字符串转义符,写在字符串里你需要写 \\ ,特别麻烦。


今天发现本 Blog 用的虚拟主机 linode 降价了,现在只要 5$ 一个月。去后台调一下即可。Linode 用 7年了,感觉非常好。

如果有同学也有兴趣租一个境外的 vps ,可以点这个链接 ,或者填我的 referral code : 538bab39bc1265a2ce54115d1f86e2bc81e4d133 。

Comments

其实我觉得对非专业用户来说,盘符是一个比较具体的好的概念,比文件系统方便多了
windows和linux都有好几年开发经历,现在回头看看,觉得其实什么/,\风格都无所谓,只是一种习惯罢了。

ps. C 系列的语言中,\ 是字符串转义符,写在字符串里你需要写 \ ,特别麻烦。

这里是“你需要写\\”吧?似乎被转义了

-用于参数分割符也容易跟文件名混淆,而/不能用于文件名.
既然MS用了\分隔目录,命令行的转义符就改用^了...

PS:印象中某些地区的PC上用$分割路径.

今天有人贴了张屏幕截图有30+ 个盘,所以才调侃这个。我查了一下的确有限制,图应该是 p 的。等下把正文改掉。

不知道你是从哪里得出"当超过 24 个盘的时候,盘符似乎是以 24 进制的方式增加的"?

微软的文档 https://support.microsoft.com/en-us/help/947021/how-to-configure-volume-mount-points-on-a-server-cluster-in-windows-server-2008,-windows-server-2008-r2,-windows-server-2012,-and-windows-server-2012-r2 第一句话就提到了 "26-letter limitation for drive letter references."

这个Apple ][太晃眼了

Post a comment

非这个主题相关的留言请到:留言本