Vista的Symbolic Link
以前一直是只有Unix-like系统上面才有Symbol Link的概念。在Unix下,Symbol Link带来了无数的好处(当然也是有缺点的)。
简单的例子,假如你创建了一堆具有相对链接的东西(比如网站上面用的页面)。如果某个文件的位置发生了变化,你会如何操作?在以前的Windows中,就要逐一修改HTML页面,指向新的位置,却难免少改了一个两个文件的。而Symbol Link正好解决这样的问题。只需要在老的位置创建一个Symbol Link,这样所有指向老的link的地方,都会自动转到新的位置。
另一个例子,在编译程序的时候(尤其是你使用Make的时候),比如lib/dll/…之类的东西有版本的区别,Unxi一般是这样写的:libxxxx-1.0.0.so,libxxxx-1.0.1.so。如果在Make文件中直接指定这些文件,不仅在版本升级的时候改起来很麻烦,而且一旦少改了一个,很可能出现莫名其妙的错误。Symbol Link上~~~
Vista开始直接支持Symbol Link了(Dev Ref),你可以使用mklink(CLI APP)来创建Symbol Link。从GUI上看,Symbol Link就是表示为一个0字节的快捷方式。在CLI里面,面向目录的Symbol Link被表示为<JUNCTION>和<SYMLINKD>;而面向文件的,则被表示为<SYMLINK>;。mklink也支持Hard Link,创建的Hard Link直接表示为和target文件一样的一个新文件。

Symbol Link和Shortcut Link是不一样的,这里我举个我刚刚完成的例子:
例子1:
前提:我使用的虚拟机是Virtual Box。刚刚装好的时候,我创建了一个Ubuntu的虚拟机。硬盘文件达到了3.5GB,这时我希望把这个文件复制到别的盘,以便节省我的硬盘空间。(这个例子其实没有Symbol Link也是完全可以的)
如果没有Symbol Link,我会这样做:首先复制Ubuntu.vdi文件到新的地方,然后启动Virtual Box修改硬盘文件的位置。
而我现在是这样做的:复制Ubuntu.vdi到新的地方,然后用mklink创建一个Symbol Link。搞定,Virtual Box仍然没有任何的变化。
当然,我使用的这个例子,不用Symbol Link也不会增加多少麻烦,可如果真的是需要修改的内容很多,那么手工修改,自然就不太适合了。不过,在这个例子中,仍然有个局限。图中的F:\是我的一个USB移动硬盘。估计有人想到了:现在移动硬盘是F:\。如果我在接入这块移动硬盘前,先 插了一个其他的存储设备,占用了F:\。那么,在之前指向F:\的Symbol Link仍然是无效的。这只能怪该死的微软,非要用字母表示分区,还是动态的。如果向Unix那样,可以任意把不同的设备挂在指定的目录中,也就没有这个 事儿了。
例子2:
前提:Vista有个Public文件夹,用来存放和用户无关的照片、音乐等。而我把MP3都复制到了Public\Music文件夹中。之前的做法是,在%HOMEPATH%\Music下创建一个Shortcut link到%PUBLIC%\Music。
使用Symbol Link可以近乎完美的解决这个问题:删除%HOMEPATH%\Music文件夹,创建一个名为%HOMEPATH%\Music的JUNCTION,指向%PUBLIC%\Music文件夹。这样的结果就是,一步多于的操作都没有,就把Music重定向到Public了。开始菜单、Favorite Link,总之以前所有指向%HOMEPATH%\Music的地方,全都自动转向%PUBLIC%\Music了。 更关键的是,以后即便不希望这种重定向发生,需要做的也只是删除Symbol Link即可。
那么Hard Link和Symbol Link有什么区别呢?在Vista中,Symbol Link其实是创建了一个指向目标文件的索引,所以当Symbol Link指向的文件被删除时,访问Symbol Link就会出现File not found的错误(就好像是快捷方式指向的文件被删除了);而Hard Link则更像是文件的另一个名字(它们虽然同名,却存储在同一片磁盘空间中),创建一个Hard Link仅仅相当于给文件添加一个“别名”,而只有当所有的名字都被删除时,文件才会真正的删除。
举例来说,如果有文件Test.txt,创建一个名为TS的Symbol Link;当文件Test.txt被删除以后,再编辑TS的时候,就会得到一个“找不到文件”的错误。而同样是Test.txt,创建一个名为TH的Hard Link;当文件Test.txt被删除后,再编辑TH,仍然是可以的。因为此时TH仍然指向以前Test.txt的空间,而删除Test.txt,只是删除了存储Test.txt文本的一个别名而已,文件实际上并没有删掉。
那么似乎Hard Link更实用一些?其实不一定,就象之前所说的,Hard Link只是指向同一磁盘区域的一个“别名”,那就是说,如果Hard Link和目标文件不在同一个分区上,别名也就不复存在了。所以Hard Link和目标文件被要求放在同一磁盘分区中。显然,Symbol Link的适用范围更广一些。
Update Aug. 17th, 2007 23:03 PST:好像有个问题,%USERPROFILE%\Links是存放显示在Explorer左侧的Favorite Links的地方,但这里貌似不支持创建指向Symbol Link(或Junction)的快捷方式。









