本文部分内容来源于网文、维基百科和微软官方网站,已经本人整理,大部分不一一注明,在此表示感谢。
一、链接的概念和历史
链接(link)简单说就是给文件系统中的“元素”起的一个别名,这个元素可能是文件、目录或者卷等,对别名(也表现为文件或者目录)的一切读写访问都被文件系统透明的映射到实际的元素(被称为目标/target)上。这样可以用多个入口访问同一个内容,但只保存一份实际的目标就可以,不用创建多个副本,既节约磁盘空间,又方便系统管理。
链接大体分为软链接(Soft Link,又称符号链接-Symbolic Link)和硬链接(Hard Link)两种,简单说如果将目标删除或移动,软链接会失效,而删除或移动目标,硬链接不会失效。当然,由于文件系统的特性不同和操作系统提供的功能差异,实际的链接表现出的属性也会更加多样化,下文会更详细介绍windows系统下的链接特性。
链接功能最早出现在1978年DEC公司出品的操作系统RDOS中,很早就被各种类Unix(Unix-like)系统支持,并被列入POSIX操作系统标准中,Linux提供了命令ln用于建立链接,Linux文件管理的相关知识可以查阅这篇文章。
微软对链接的支持姗姗来迟,从windows 2000的NTFS 3.0文件系统才开始出现,但操作系统提供的相关功能,在2000/xp系统中还不完善。2000/xp下的符号链接由命令linkd实现,挂载卷由mountvol命令实现,挂载(映射)网络驱动器由mount命令实现。linkd的一个替代品是第三方Winternals Software LP提供的Junction命令,据说比系统自带的强大,它也被集成到了不少xp启动盘的Win PE系统中。在vista后,linkd已经被mklink命令取代。此外在2000/xp下,用图形界面对符号链接进行操作,据说其效果与Win7不同,删除硬链接会同时删除目标,笔者没有深入考证或测试过,只在此处提醒请读者使用时注意。有关2000/xp下符号链接的更详细内容,可以参阅微软相关技术文档。
二、Win7下创建符号链接
mountvol命令依然被Win7支持,用于将磁盘上的卷(分区)挂载到现有目录中,磁盘管理器也提供了图形界面下的同样功能。曾经有没用过Linux的程序员提问,如果硬盘分区很多,26个字母给驱动器不够分怎么办,答案就是把分区挂载到目录里。
mount命令Win7下已经不支持了,但由于资源管理器提供了“映射网络驱动器”的功能,所以没有也不影响什么。
上述两个命令功能简单,又有图形界面支持,不继续介绍了,下面说说最重要的命令,用于对文件和目录创建符号链接的mklink:
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径(相对或绝对)。
这是命令行窗口中队mklink命令提供的帮助信息,这个命令及参数都不区分大小写。Link就是链接的名称和路径,target是目标的文件名或路径(如果是文件夹),如果Link或target字符串中有空格,应当加双引号。不带参数,是对文件创建软链接(微软用了符号链接这个名词),带参数/h是对文件创建硬链接,带参数/d和/j都是对目录创建软链接,但略有差别。微软用的名词比较晦涩,下文剖析时为叙述方便,称用/d参数创建的链接为d型链接,称/j参数创建的为j型链接。
这个命令最标准的形式应当类似下面的例子:
mklink "e:\test\b.txt" "e:\test\a.txt"
为e:\test\目录下的a.txt创建文件软链接b.txt。
mklink /d "e:\test\bb" "e:\test\aa"
为e:\test\目录下的子目录aa创建d型链接bb。
标准形式是链接和目标都使用绝对路径,链接和目标类型相同(同样是文件或同样是目录)。但也有一些不标准甚至明显错误的用法,也被命令所支持,下面一并列出(假设e:\test目录下有a.txt和aa目录两项)。
E:\test>mklink b.txt a.txt
E:\test>mklink /h b.txt a.txt
E:\test>mklink /d cc aa
E:\test>mklink /j cc aa
上述命令都是正确的(当然有重名不行,执行第2、4条命令时,要把第1、3条命令生成的链接删掉,下同),对文件和目录建立链接都支持相对路径,注意此时已经移动到E:\test下了。创建链接后,对链接的访问与对目标访问效果也相同,对两者中任意一个的修改,也会体现在另一个上。
mklink c.txt aa
mklink /d bb a.txt
mklink /j cc a.txt
上述命令都能成功执行,将一个文件链接到目录上,或者将目录链接到文件上,都是合法的,当然访问会出错。但下面这个命令不合法:
E:\test>mklink /j c.txt aa
也就是说不能对目录创建文件硬链接。
此外,给一个不存在的目录创建d型和j型链接,以及给不存在的文件创建软链接都是合法的,但不能给不存在的文件创建硬链接。
对目录进行递归链接也是可以的,比如执行这条命令:
E:\test>mklink /j aa\bb aa
当打开aa文件夹的时候会发现里面有个bb文件夹,打开bb里面还有bb……
三、对链接进行操作的效果
1. 对文件软链接操作
如果创建文件软链接时,目标采用了相对路径,用剪切-粘贴将链接移动到相同分区其他位置后,将无法打开,例如:
E:\test>mklink e:\test\b.txt a.txt
如果用绝对路径输入目标,将链接移动到相同分区其他位置后,不改变链接关系。也就是说链接文件依然能够访问,进行修改之后,修改也会体现在目标上。例如:
E:\test>mklink e:\test\b.txt e:\test\a.txt
E:\test>mklink b.txt e:\test\a.txt
无论用相对路径还是绝对路径创建文件软链接,将链接移动到其他分区,则变成一个独立文件,并不再与目标保持链接关系。相当于把目标复制到新位置(并重命名)。
无论用相对路径还是绝对路径创建文件软链接,将链接复制粘贴后,也将新生成一个独立文件。
重命名链接文件,不改变链接关系。
删除链接不影响目标文件。
2.对目录d型链接的操作
目录d型链接的特性与文件软链接大部分相同,但有一点差异:
无论用相对路径还是绝对路径创建d型链接,将链接移动(剪切)到其他分区,链接变成一个独立空文件夹。
此外需要注意,将链接复制时,目标目录下所有内容也跟着被复制。
3.对文件硬链接的操作
无论用相对路径还是绝对路径创建硬链接,将链接移动到相同分区其他位置都不改变链接关系。如果移动到其他分区,链接将变为一个独立文件。
复制硬链接与复制软链接效果相同。
重命名链接,不改变链接关系。
删除链接不影响目标。
4.对目录j型链接的操作
无论用相对路径还是绝对路径创建j型目录链接,通过剪切-粘贴(试图)对链接移动,无论移动至何处,将产生如下效果:
原位置的链接依然存在,链接关系依然保持。
链接在新位置变成了一个独立的文件夹,与原目标文件夹不再保持链接关系。
目标文件夹中的全部内容都移到了新位置,目标文件夹变成空文件夹。
复制j型目录链接的效果与复制d型链接的效果相同。
重命名链接,不改变链接关系。
删除链接不影响目标。
联系客服