Windows的四种链接方式
习惯Linux的用户会经常忘记还有一种操作系统叫Windows,或者说的更准确一些,是忘记了Windows也是一种“操作系统”。这里所说的“操作系统”的意思是,Windows也符合我们在操作系统课上学的诸多概念的设计及实现。但是由于Linux经常将这些细节暴露给我们,所以我们经常会把操作系统课上学到的东西和Linux相联系,却没有意识到Windows也实现了相应设计。
举个最简单的例子,在Linux中,当我们需要访问除硬盘外的外部设备时,我们都需要通过mount命令将设备所对应的文件挂载到当前文件系统下的某个目录中。但是我们却没有意识到在Windows下,当我们插入U盘时,系统内部同样做了“挂载”操作,只不过Windows将这个设备默认挂载到了“我的电脑”下而已。并且Windows与Linux一样,其实挂载到“我的电脑”只是一个默认选项,我们可以更改挂载点的位置。这种更改甚至可以在图形界面下执行:
从这里我们可以看出,操作系统并没有什么新奇的东西。即使看似差异如此之大的Windows和Linux,也会实现相同的功能,只不过Windows走的进一步而已。
同样,在Windows下,链接的功能也是被实现了的(虽然我们不会经常发现)。在Linux下,我们都知道链接有两种形式:硬链接和软链接。所谓硬链接,我们可以理解为硬链接持有的是文件本身(而不是路径)的引用。也就是说,当我们给一个名为a.txt的文件建立硬链接(b.txt)后,那么b.txt指向的位置就是a.txt这个文件本身,而此时,a.txt和b.txt是同级平行的,这个文本文件此时同时拥有两个文件名。当我们删除a.txt时,只是删除了a.txt这个文件名,这个文件仍然被b.txt所引用,所以我们还能够通过b.txt访问。而软链接,持有的则是原链接路径。比如a.txt位于 ~/Document/a.txt ,那么为其建立软链接b.txt的内容就是"~/Document/a.txt",此时,我们访问b.txt,其实是在按照a.txt的路径去访问a.txt。如果我们这时删除a.txt这个文件,那么b.txt也会无效,因为路径已经断掉。
Linux下的链接很多书都会讲到,一般来说,我们可以通过
ln <source> <destination> 来建立硬链接,通过 ln -s <source> <destination> 来建立软链接(其中的s即是symbolic,也就是‘符号链接’,软链接的别名)。
从Ubuntu下面我们可以看到,在xfce下硬链接无论从图标还是属性,都与正常文件无异,而软链接的图标则是带有一个箭头,属性也是属于link。
通过 ls -li 命令我们也可以看出这一点
其中硬链接和原文件的文件号均相同,而软链接则是有了l属性,并且在文件路径处显式说明了链接位置。
用过Linux或者上过操作系统课的同学大概会对这一点很了解,实际上,Windows中也存在着各种链接方式,只不过我们不曾注意而已。后来,我根据Wikipedia和M$的文档,整理出了Windows下面的4中链接方式:
1 硬链接
和GNU/Linux相同的是,Windows也有自己的链接创建工具mklink。Windows下的硬链接只允许在NTFS格式的文件系统下创建(通过CreateHardLink()系统调用),并且和Linux一样,硬链接的创建只能针对文件,而不能针对目录。
创建硬链接的命令时 mklink /H <destination> <source> ,在创建后的图标也和原文件的图标一样,在属性中也无法看出其中的链接关系。唯一的方法就是通过 fsutil hardlink list <filepath> 来查看一个文件包含了多少硬链接
2 软链接(符号链接)
创建软链接的命令为 mklink <destination> <source> ,也就是不为mklink提供其他的参数。建立之后,我们会发现软链接图标带有一个快捷方式样式的箭头,但是其文件属性的类型仍为原来的文件类型,Size却为0,并且有很多项都是灰色disable状态
但是需要说明的是,通过这种方式建立软链接只能针对文件建立。如果需要给文件夹建立软链接,那么就需要通过 mklink /D <destination> <source> 命令来建立
3 Junction
Junction是Windows(NTFS)特有的一种链接方式。Junction和软链接类似,也是通过记录文件路径来访问文件。但是首先,Junction只针对文件夹,我们不能为文件建立Junction;其次,当我们删除Junction链接后,原文件夹也会被删除。Junction最常用的地方是用户目录下,我们会看到一些带有快捷方式图标的隐藏文件夹,但是当我们试图去访问的时候,则会被拒绝(即使是管理员也不行)。
我们可以通过 mklink /J <destination> <source> 命令来建立Junction。在直观看来,Junction似乎也是介于软硬链接之间的一种奇葩存在,比如Junction的图标是带有箭头的,但是在文件夹的属性中,却看不到类似于软链接的那种shortcut选项卡,更像是硬链接的感觉。
实际上,Windows之所以要在用户目录下面建立诸多的Junction的目的就在于和老版本的软件兼容。我们知道在xp时代,程序数据通常储存在Application Data文件夹中,但是当Windows转向Vista时,目录名和位置都有所变化,变成了AppData,这样,对于以前的硬编码安装路径的程序,就会遇到安装错误的问题。于是MS决定通过Junction的方式来解决。这样当某个程序访问或写入Application Data时,其所访问的是AppData文件夹,这样就避免了版本不兼容的问题。(其实MS在兼容性的问题上一直非常重视,看过《观止——微软创建nt和未来的夺命狂奔》一书的同学会深有感触)
4 快捷方式
其实我们最熟悉也是最常用的快捷方式并不属于传统概念上的“链接”。虽然似乎快捷方式有点类似于软链接,但是它们的本质还是非常不同的。链接其实更贴近操作系统和文件系统的概念。而快捷方式,其实是一个真真实实的以lnk作为文件类型的文件。只不过操作系统(更确切的说是Windows的shell,explorer)可以对这种lnk文件解释而已。而快捷方式的功能其实也要比传统的Linux或WIndows的软链接的功能更强大一些。如果我们打开一个快捷方式的属性,我们就会发现原来在软链接的属性中不可修改的部分都变成了可以修改的,这里面包含了文件的打开方式,快捷键,以何种窗口模式打开等属性。
也就是说,快捷方式不同于软链接的地方,就是它不仅仅是个包含文件路径的文件,而是增加了许多其他信息。这种和窗口化相关的信息如果基于文件系统自然是非常不便的,所以M$就单独设计了lnk文件,由explorer来执行。
以上就是Windows的四种链接方式,包括和linux类似的硬链接、软链接,还有自己设计的Junction和快捷方式。我们在学习操作系统时通常会用Linux来做示范,但是正如同我们只会用Windows就会被Windows所局限一样,一味地使用Linux也会使我们看不清操作系统所必需和Linux的自己的设计。而Windows作为成熟的商业化产品,也可以让作为学生的我们提前领略到一个商业的设计所作出的取舍。
本文转载自 《Windows的四种链接方式》