WINDOWS 的 MKLINK : 硬链接,符号链接 : 文件符号链接, 目录符号链接 : 目录联接

在xp系统下,junction命令要用微软开发的小程序 junction.exe实现,从http://live.sysinternals.com/可以下载。

现在Windows Vista之后的系统自带了mklink的功能。

Windows操作系统启动时不支持符号链接。所以不应该对下列文件夹重定向:

目录包含了hiberfil.sys (如果被配置在根目录以外)
\Windows
\Windows\system32
\Windows\system32\Config
Windows Installer不完整支持符号链接。对\Windows\Installer重定向会导致多数基于.msi的Windows installers失败报告error 2755 或 error 1632.

可以重定向下列目录:

\Documents and Settings
\ProgramData
\Program Files
\Program Files (x86)
\Users
但是对\Users与\ProgramData重定向不被推荐,因为会打破Windows Update与Windows Store Apps.

Windows Vista中预先创建了一些符号链接(Junction point),以增进与旧版操作系统(Windows XP)间的兼容性,部分示例如下:

C:\Document and Settings → C:\Users(连接点)
C:\Users\All Users → C:\ProgramData(目录符号链接)
MKLINK [[/D] | [/H] | [/J]] Link Target

/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径(相对或绝对)。
默认情况:

文件的符号链接(SYMLINKD),如没有参数指定,则创建文件的符号链接,删除文件链接不影响目标文件,且创建链接时允许目标文件不存在;
目录的符号链接(SYMLINKD) /D该参数可以创建目录的符号链接,删除目录链接不会影响目标目录,且创建链接时允许目标目录不存在;
目录的软链接(JUNCTION) /J 该参数可以创建目录的软链接(联接),作用基本和符号链接类似,NT6系统的用户目录就是以这种形式存在的;
文件的硬链接 /H 该参数可以创建文件的硬链接,即一个文件的多个别名,NT6系统WinSXS目录下的大部分文件是以这个形式存在的;
NTFS符号链接(Symbolic Link),又称符号链接,是NTFS文件系统中指向文件系统中的另一个对象的一类对象。

被指向的对象叫做“目标”。它们可以像普通文件一样操作,但所有对符号链接的操作都实际作用于目标对象。

符号链接对用户而言是透明的,符号链接看上去和普通的文件和文件夹没有区别,操作方法也一模一样。

NTFS符号链接的设计目的是为了和POSIX标准的操作系统兼容、并用来增进与旧版操作系统的兼容性,它首次出现于Windows Vista。

Windows 2000开始就有的NTFS连接点,只能用于目录,且只能用于本地文件系统。

而符号链接既可以指向本地文件,也可以指向远程SMB网络路径。

NTFS连接点只支持本地驱动器的绝对路径,但NTFS符号链接允许使用相对路径。

还有,NTFS符号链接允许跨文件系统使用,但是对于跨主机的符号链接,还需要远程机器也支持这一功能才行。

硬链接只能用于文件,不能用于目录。

硬链接相当于一个实体文件有多个彼此平等的名字。

删除一个文件名字后,还可以用其它名字访问该文件。

硬链接只能用于同一个磁盘分区内的文件。

硬链接不能用于空文件,而符号链接可以用于空文件或空目录。

符号链接(Symlink,Softlink)是对文件或目录的引用,实际上符号链接本身是一个

“记录着所引用文件或目录的绝对或相对路径”的特殊文件,通过符号链接的操作都会被重定向到目标文件或目录。

交接点(Junction),也称为“再分析点”,是 NTFS 3.0 及以上文件系统(Windows 2000 及以上系统)的特性,

它是链接本地目录(可跨卷)的访问点,通过交接点的操作都会被系统映射到实际的目录上。

通过建立交接点,可以在保证一个目录实例(目录的一致性)的前提下,允许用户或程序从本地文件系统中的多个位置访问此目录。

对符号链接和快捷方式的“读、写、遍历”等操作都会被重定向到目标文件或目录;
但对它们的“复制、删除、移动、配置 ACL”等操作只针对自身;
符号链接不但可以应用于本地系统,还可以应用 UNC 路径。

对交接点内文件和子目录的“建立、删除、修改”等操作都被映射到对应的目录中的文件和子目录上;
对交接点的“复制、粘贴、剪切、配置 ACL”,只会影响此交接点;
在同一卷内移动交接点,只会影响此交接点;但在不同卷间移动交接点,会将此交接点转换为正常目录,并且交接点对应目录下的所有内容都会被移动;
通过“资源浏览器(Explorer.exe)”和“命令行 del”等工具删除交接点时,会同时删除对应目录下的所有内容(但不会删除目录);
可通过“linkd.exe /d”安全的删除交接点;但在 vista 及以后的系统中,对交接点的删除会被正确的处理。

符号链接 symlink 与 交接点 junction 在重定向对目录下的子目录和文件的操作上基本没有什么区别。
它们两最大的区别在于 符号链接 symlink 可以用于引用文件,而 交接点 junction 只能引用目录。

创建符号链接和软链接时允许目标文件或目录不存在,此时若访问链接文件会得到一个“位置不可用”的提示,
若之后重新将目标文件或目录补上(路径、名称一致即可),则该链接仍然有效;

目录符号链接和软链接的区别在于,软链接在创建时会自动引用目标目录的绝对路径,而符号链接允许相对路径的引用,

如分别用 mklink /D dira tdir 和 mklink /J dirb tdir 创建 dira、dirb 对 tdir 的符号链接和软链接,
之后将 dira、dirb 移动到其它目录下,则访问 dira 时会提示“位置不可用”,访问 dirb 时仍然正常指向 tdir;

而分别用 mklink /D dira c:\demo\tdir 和 mklink /J dirb c:\demo\tdir 创建 c:\demo\tdir 的符号链接和软链接,
再将这两个目录链接移动到其它目录下,则 dira 和 dirb 均可正常指向 c:\demo\tdir;

由此可见当创建目录链接时对目标目录使用绝对路径,D 和 J 两个参数实现的目录链接效果是一样的

只能创建文件的硬链接,使用/H 参数创建目录的硬链接时会提示拒绝访问;

硬链接是同一个文件的不同别名,例如对

a.txt 创建了b.txt 和c.txt 两个硬链接,此时 a.txt、b.txt 和 c.txt 均是同一个文件的别名,
若删除其中任意一个或两个,则剩下的那个文件(无论是事先存在还是之后创建)不受影响,仍然指向原先那个文件。

创建文件或目录链接仅限于 NTFS 文件系统,且链接只能针对同一个磁盘上的文件或目录;

硬链接只能创建对本分区文件的引用,即不可创建跨分区的文件硬链接;

通过硬链接创建的别名文件在统计大小时会按原文件的大小计算,而软链接和符号链接大小均为零;

硬链接在创建时会事先检测目标文件是否存在,即不允许空链接的存在。

通过mklink命令的帮助信息,可以看到mklink可以创建目录和文件链接。

比如D:\temp目录下有目录dir1,我想在当前目录下创建到dir1目录的软链接,可以使用如下命令来操作:

mklink /D dir2 dir1
mklink /J dir3 dir1
上面两个命令都可以实现到dir1的软链接,参数/D和/J是创建目录软链接必须的,目前来说着两个参数都可以实现目录软链接,
而且应用过程中也没有发现有什么区别的地方,唯一的区别就是dir2和dir3链接的类型不懂,可以通过dir命令查看得到结果如下:

2011/05/17 14:05

dir1
2011/05/24 13:07 dir2 [D:\temp\dir1]
2011/05/24 13:07 dir3 [dir1]
我们可以发现dir1是DIR类型(这个是我们创建的实际目录),dir2是JUNCTION类型,而dir3是SYMLINKD类型,这个或许是区别,但应用中效果一样。
说完了目录软链接,文件当然也可以创建软链接了,而且还可以创建硬连接,比如d:\temp目录下有abc.txt文件,我要创建到这个文件的软链接的命令如下:

mklink abc1.txt abc.txt
这样我们就创建了一个到abc.txt文件的软链接abc1.txt,对于文件还可以创建硬链接,硬链接个人感觉用处不大,因为创建硬链接是磁盘上空间是增加了双倍,
对于硬链接而言,修改硬链接文件和原始文件的内容都会相互影响,即内容是一致的但空间占用确是双份的。使用如下命令创建硬链接:

mklink /H abc2.txt abc.txt
文件的软链接和硬链接的类型查看如下(用dir命令):

2011/05/24 13:33 7 abc.txt
2011/05/24 13:30 abc1.txt [abc.txt]
2011/05/24 13:33 7 abc2.txt
发现硬链接和普通的文件没有什么区别,唯一的区别就是修改的内容会直接影响到原始文件。

顺带补充一句,软链接的目录和文件都可以直接删除,不会影响到原始目录和文件的,这个也非常方便,

而且软链接的目录和文件图标上都有一个小箭头,很好区分。

使用/D建立的连接是类似于linux下的软连接,不占存储空间;

使用/J建立的连接类似于Linux下的硬连接,占用同源文件一样的存储空间;

Link和Target文件夹内容一模一样,如果你对其中任意一个文件夹里面的内容做修改,另一个也会相应的改变。
通过建立符号链接(symbolic)磁盘空间使用量没有改变哦,因为只是实现连接罢了,并不是将原文件复制以及同步。

使用连接目录时就像使用原目录一样,就像实实在在有这个目录一样,程序不会发现连接目录与普通目录有何不同,这是一般的文件夹快捷方式是不行的。

与快捷方式的相同与不同之处:

快捷方式无论目标是文件还是目录,生成的都是新的有内容的 .lnk 文件,
打开时是打开的源路径,直接编辑则是编辑 .lnk 文件的内容,源文件/目录不受影响。

MKLINK 生成的文件和目录都是 0 字节,但访问时仍然是新文件/目录的路径,且编辑操作编辑的是源文件/目录;
原理相当于网盘的同步,只不过不通过网络、不占用空间。