硬连接 软连接(符号链接) 快捷方式总结
一些缓存盘符和cookie盘符之类的放在系统盘符深处,查找不方便,以及系统盘符因为长久的使用而变得臃肿,导致系统盘符面临满载的情况
我们可以把他们全部搬家到其他空余的盘符,并且统一的放在一个方便查找的文件夹内统一管理,这样就解决了各方面的问题
网上有很多搬家的方法,常用的是注册表修改,但是也只能用于部分文件夹,还有绝大多数文件夹是不能通过注册表来迁移的,
现在我们就来介绍一个可以随意搬迁任何文件和目录的方法.在此之前我们先简单介绍一下:硬连接 软连接(符号链接) 快捷方式的大致用意
对于硬连接 软连接(符号链接) 快捷方式,因为相互关系比较混乱我自己简单的理解为:
硬连接:只能在同一盘符建立的连接,占用共同的磁盘空间,相互的操作都会影响到对方,移动连接后不会失效
软件界(符号连接):可以垮盘符的建立连接,可以用于文件和目录,占用共同的磁盘空间,相互操作都会影响到对方,但是移动连接后会使连接失效发生错误警告
快捷方式:用于文件和目录,可以随便移动,只是单纯的一个连接指针,打开后会直接跳转到目标位置,目标被删除后,连接就会失效.
以上个人理解如有理解失误之处还请指出
这里提供相关百科让你更加深入的了解: 硬连接 软连接(符号链接) 快捷方式
下面给出实现这些连接功能的几款软件 和相关的辅助软件
目前vista之后的系统都自带了建立这些连接的方法,在命令行下输入mklink命令进行操作 查看帮助请输入: mklink /?
xp和2003系统需要下载一些命令行软件来实现:
Junction v1.06 建立软连接的软件Link Shell Extension :通过右键等方法建立各种连接 具体使用请看官方网站
命令行工具 Ln : 功能跟上面的LSE是一样的,具体使用方法请看其官方网站
查找重复文件的命令行工具Dupemerge : Dupemerge可以查找硬盘上的重复文件,并为其创建硬连接,以达到节省空间的目的。 需要注意的是,不要将一些软件中“雷同的”——通常是零字节——配置文件也弄成硬连接了 具体使用方法请看
AcuteFinder :(同上面提到的Dupemerge)这个软件可以导出文件列表,然后在excel里面编辑生成硬连接的批处理文件。保存运行就好了。
以上几种软件都可以实现这些功能,各有各的好处,具体用法并深入的了解 硬连接 软连接(符号链接) 快捷方式请参见下面的各大文章
--------------------以下是在网上搜集的相关资料,比较详细的介绍了各操作系统的硬链接 软连接(符号链接) 快捷方式的区别和使用方法--------------------------
Windows下的符号链接换了新本本之后,不安于Windows Server 2003 R2了,之前也尝试过Windows Vista / Windows 7 / Windows Server 2008,但最后都由于各种不爽的原因而放弃,主要还是电脑配置太差,这次终于有机会升级系统了,于是装了Windows Server 2008 R2,用了两个月感觉还不错,各方面表现还算凑和,基本上还算爽。
发现2008R2的用户目录结构有了点变化(Win7好像也相同),不再是以前那种 SYS:\Documents and Settings\xxx 了,改成了 SYS:\Users\xxx,即使是使用dir /a查看,有个隐藏的Documents and Settings也是指向[SYS:\Users]的JUNCTION。而且SYS:\User\xxx\之下的目录结构也有了大变化,之前Windows版本中的很多目录都被移到了SYS:\User\xxx\AppData之下,SYS:\User\xxx\之下的目录大都是一些用户文件存放的目录,以前都在“我的文档”中,现在都被放到了用户目录中,一大堆“我的xx”目录。
这样问题就来了,以前我都是直接把“我的文档”通过“移动”操作挪到D:盘,现在要挪一大堆目录,而且有的还不能挪动。Google之,找到很多相关文章,修改注册表的方法本人不太喜欢,相比之下觉得这个老外的“How to Move your Windows User Profile to another Drive” 写的很不错,很好很强大!原来NTFS早就支持JUNCTION了,只是我一直不知道,寒自己一个!也可能是本人使用Linux的缘故吧,对使用符号链接尤为钟情。很轻松的就把我的用户目录挪到了D:盘,mklink还真是很强大。这几天又把我的OpenSSHServer的git库目录挪到了我的Workspace目录,OpenSSHServer里只放了一个JUNCTION,然后又把经常和移动硬盘同步的几个目录都mklink到一个目录里,这样以后就只要同步一个目录就OK了,实在是太方便了!
今天心血来潮突然想试试mklink在XP下的表现,反正是NTFS都是支持JUNCTION的。在2008R2的整个系统盘中搜索mklink.exe居然没搜到,Google一下才知道,原来mklink是一个DOS的内部命令!晕了,再Google“mklink XP”,搜到两个工具junction.exe和linkd.exe,都可以实现目录的JUNCTION,果然很好用!可惜自己却一直都不知道,在这一点上看来是本人对Windows有偏见了,总觉得它太差。
关于目录联接<JUNCTION>和目录符号链接<SYMLINKD>之本人体会:
mklink /j 创建目录联接<JUNCTION>,类似于硬链接,但又不是硬链接,它使用绝对路径,创建的链接可移动到任意位置使用;
mklink /d 创建目录符号链接<SYMLINKD>,它可以使用相对路径,使用相对路径创建的链接,移动位置后不能工作。
另,mklink /j 只用于创建目录联接<JUNCTION>,而符号链接可以创建文件的或目录的均可。
最后,转载一些关于mklink的文字,由于已经搞不清最终的原作者了,在此原作者表示无上的敬意!
---------------------------------------------- 无敌分割线 ---------------------------------------------------------
一、何为 mklink
mklink 是何方神圣,值得专门作文讲述?
如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。
mklink 便是用来创建符号链接的,这个命令并不知名,使用的人也不多。
自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。
>dir C:\Users\wclu /a
驱动器 C 中的卷是 win7
卷的序列号是 8CD0-A743
C:\Users\wclu 的目录
2009/06/11 11:42 <DIR> .
2009/06/11 11:42 <DIR> ..
2009/06/11 00:04 <DIR> AppData
2009/06/11 00:04 <JUNCTION> Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11 00:04 <DIR> Contacts
2009/06/11 00:04 <JUNCTION> Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11 10:05 <DIR> Desktop
2009/06/11 00:04 <DIR> Documents
2009/06/11 02:44 <DIR> Downloads
2009/06/11 00:04 <DIR> Favorites
2009/06/11 00:04 <DIR> Links
2009/06/11 00:04 <JUNCTION> Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11 00:04 <DIR> Music
2009/06/11 00:04 <JUNCTION> My Documents [C:\Users\wclu\Documents]
上述标红色的文件,便是符号链接了(上述文件并非C:\Users\wclu目录下全部文件) 。
Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。
二、mklink 用法
mklink 只能在命令提示符 “CMD” 中使用。
>mklink /?
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。黙认为文件
符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
注:上述的符号链接等同于Linux中的软链接。
为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 1.txt。
创建文件链接
E:\>mklink c:\1 c:\a\1.txt拒绝访问。
E:\>mklink c:\2.txt c:\a\1.txt
为 c:\2.txt <<===>> c:\a\1.txt 创建的符号链接
可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。
E:\>mklink c:\a\1.txt d:\3.txt
当文件已存在时,无法创建该文件。
E:\>mklink d:\3.txt c:\a\1.txt
为 d:\3.txt <<===>> c:\a\1.txt 创建的符号链接
可见为文件创建链接时,必须是 “mklink 符号链接文件名 原文件名”的格式。
创建目录链接
E:\>mklink /d c:\b d:\a
为 c:\b <<===>> d:\a 创建的符号链接
虽然d:\a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。
E:\>mklink /d d:\a c:\a
为 d:\a <<===>> c:\a 创建的符号链接
E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884
D:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:08 <SYMLINK> 3.txt [c:\a\1.txt]
2009/06/11 13:18 <SYMLINKD> a [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
4 个目录 31,089,442,816 可用字节
当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。
三、mklink /d 与 makelink /j 的异同
从 mklink 的帮助中可以看到,两者皆可以创建目录链接。
细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。
一字之差,有何分别?
下面分别用这两种方式为同一目录创建链接:
E:\>mklink /j d:\a c:\a
为 d:\a <<===>> c:\a 创建的联接
E:\>mklink /d d:\b c:\a
为 d:\b <<===>> c:\a 创建的符号链接
下面显示D分区中的文件及目录列表:
E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884
D:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <JUNCTION> a [c:\a]
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
5 个目录 31,089,442,816 可用字节
mklink 不加参数或加参数 /d 时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。
当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:
从最开始的 “ >dir C:\Users\wclu /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。
四、链接文件的特性
刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。
符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)
当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。
如何实现符号链接文件的复制呢?
>copy /?
/L 如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。
>xcopy /? /B 对照链接目标复制符号链接本身
/* d:\1.txt 为<SYMLINK>型符号链接 */
E:\>xcopy d:\1.txt e:\1.txt /b
目标 E:\1.txt 是文件名
还是目录名
(F = 文件,D = 目录)? F
D:\1.txt
复制了 1 个文件
/* d:\a 为<JUNCTION>型符号链接 */
E:\>xcopy d:\a e:\a /B
目标 E:\a 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件
/* d:\b 为<SYMLINKD>型符号链接 */
E:\>xcopy d:\b e:\b /B
目标 E:\b 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件
E:\>dir e: /a
驱动器 E 中的卷是 data
卷的序列号是 FEEE-FB51
E:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <DIR> a
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
4 个目录 31,362,203,648 可用字节
可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。
符号链接文件的透明性
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。
换了新本本之后,不安于Windows Server 2003 R2了,之前也尝试过Windows Vista / Windows 7 / Windows Server 2008,但最后都由于各种不爽的原因而放弃,主要还是电脑配置太差,这次终于有机会升级系统了,于是装了Windows Server 2008 R2,用了两个月感觉还不错,各方面表现还算凑和,基本上还算爽。
发现2008R2的用户目录结构有了点变化(Win7好像也相同),不再是以前那种 SYS:\Documents and Settings\xxx 了,改成了 SYS:\Users\xxx,即使是使用dir /a查看,有个隐藏的Documents and Settings也是指向[SYS:\Users]的JUNCTION。而且SYS:\User\xxx\之下的目录结构也有了大变化,之前Windows版本中的很多目录都被移到了SYS:\User\xxx\AppData之下,SYS:\User\xxx\之下的目录大都是一些用户文件存放的目录,以前都在“我的文档”中,现在都被放到了用户目录中,一大堆“我的xx”目录。
这样问题就来了,以前我都是直接把“我的文档”通过“移动”操作挪到D:盘,现在要挪一大堆目录,而且有的还不能挪动。Google之,找到很多相关文章,修改注册表的方法本人不太喜欢,相比之下觉得这个老外的“How to Move your Windows User Profile to another Drive” 写的很不错,很好很强大!原来NTFS早就支持JUNCTION了,只是我一直不知道,寒自己一个!也可能是本人使用Linux的缘故吧,对使用符号链接尤为钟情。很轻松的就把我的用户目录挪到了D:盘,mklink还真是很强大。这几天又把我的OpenSSHServer的git库目录挪到了我的Workspace目录,OpenSSHServer里只放了一个JUNCTION,然后又把经常和移动硬盘同步的几个目录都mklink到一个目录里,这样以后就只要同步一个目录就OK了,实在是太方便了!
今天心血来潮突然想试试mklink在XP下的表现,反正是NTFS都是支持JUNCTION的。在2008R2的整个系统盘中搜索mklink.exe居然没搜到,Google一下才知道,原来mklink是一个DOS的内部命令!晕了,再Google“mklink XP”,搜到两个工具junction.exe和linkd.exe,都可以实现目录的JUNCTION,果然很好用!可惜自己却一直都不知道,在这一点上看来是本人对Windows有偏见了,总觉得它太差。
关于目录联接<JUNCTION>和目录符号链接<SYMLINKD>之本人体会:
mklink /j 创建目录联接<JUNCTION>,类似于硬链接,但又不是硬链接,它使用绝对路径,创建的链接可移动到任意位置使用;
mklink /d 创建目录符号链接<SYMLINKD>,它可以使用相对路径,使用相对路径创建的链接,移动位置后不能工作。
另,mklink /j 只用于创建目录联接<JUNCTION>,而符号链接可以创建文件的或目录的均可。
最后,转载一些关于mklink的文字,由于已经搞不清最终的原作者了,在此原作者表示无上的敬意!
---------------------------------------------- 无敌分割线 ---------------------------------------------------------
一、何为 mklink
mklink 是何方神圣,值得专门作文讲述?
如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。
mklink 便是用来创建符号链接的,这个命令并不知名,使用的人也不多。
自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。
>dir C:\Users\wclu /a
驱动器 C 中的卷是 win7
卷的序列号是 8CD0-A743
C:\Users\wclu 的目录
2009/06/11 11:42 <DIR> .
2009/06/11 11:42 <DIR> ..
2009/06/11 00:04 <DIR> AppData
2009/06/11 00:04 <JUNCTION> Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11 00:04 <DIR> Contacts
2009/06/11 00:04 <JUNCTION> Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11 10:05 <DIR> Desktop
2009/06/11 00:04 <DIR> Documents
2009/06/11 02:44 <DIR> Downloads
2009/06/11 00:04 <DIR> Favorites
2009/06/11 00:04 <DIR> Links
2009/06/11 00:04 <JUNCTION> Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11 00:04 <DIR> Music
2009/06/11 00:04 <JUNCTION> My Documents [C:\Users\wclu\Documents]
上述标红色的文件,便是符号链接了(上述文件并非C:\Users\wclu目录下全部文件) 。
Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。
二、mklink 用法
mklink 只能在命令提示符 “CMD” 中使用。
>mklink /?
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。黙认为文件
符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
注:上述的符号链接等同于Linux中的软链接。
为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 1.txt。
创建文件链接
E:\>mklink c:\1 c:\a\1.txt拒绝访问。
E:\>mklink c:\2.txt c:\a\1.txt
为 c:\2.txt <<===>> c:\a\1.txt 创建的符号链接
可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。
E:\>mklink c:\a\1.txt d:\3.txt
当文件已存在时,无法创建该文件。
E:\>mklink d:\3.txt c:\a\1.txt
为 d:\3.txt <<===>> c:\a\1.txt 创建的符号链接
可见为文件创建链接时,必须是 “mklink 符号链接文件名 原文件名”的格式。
创建目录链接
E:\>mklink /d c:\b d:\a
为 c:\b <<===>> d:\a 创建的符号链接
虽然d:\a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。
E:\>mklink /d d:\a c:\a
为 d:\a <<===>> c:\a 创建的符号链接
E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884
D:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:08 <SYMLINK> 3.txt [c:\a\1.txt]
2009/06/11 13:18 <SYMLINKD> a [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
4 个目录 31,089,442,816 可用字节
当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。
三、mklink /d 与 makelink /j 的异同
从 mklink 的帮助中可以看到,两者皆可以创建目录链接。
细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。
一字之差,有何分别?
下面分别用这两种方式为同一目录创建链接:
E:\>mklink /j d:\a c:\a
为 d:\a <<===>> c:\a 创建的联接
E:\>mklink /d d:\b c:\a
为 d:\b <<===>> c:\a 创建的符号链接
下面显示D分区中的文件及目录列表:
E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884
D:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <JUNCTION> a [c:\a]
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
5 个目录 31,089,442,816 可用字节
mklink 不加参数或加参数 /d 时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。
当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:
从最开始的 “ >dir C:\Users\wclu /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。
四、链接文件的特性
刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。
符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)
当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。
如何实现符号链接文件的复制呢?
>copy /?
/L 如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。
>xcopy /? /B 对照链接目标复制符号链接本身
/* d:\1.txt 为<SYMLINK>型符号链接 */
E:\>xcopy d:\1.txt e:\1.txt /b
目标 E:\1.txt 是文件名
还是目录名
(F = 文件,D = 目录)? F
D:\1.txt
复制了 1 个文件
/* d:\a 为<JUNCTION>型符号链接 */
E:\>xcopy d:\a e:\a /B
目标 E:\a 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件
/* d:\b 为<SYMLINKD>型符号链接 */
E:\>xcopy d:\b e:\b /B
目标 E:\b 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件
E:\>dir e: /a
驱动器 E 中的卷是 data
卷的序列号是 FEEE-FB51
E:\ 的目录
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <DIR> a
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 09:58 <DIR> System Volume Information
1 个文件 0 字节
4 个目录 31,362,203,648 可用字节
可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。
符号链接文件的透明性
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。
在 Linux 使用的 ext2 等文件系统里,都有 hard link 与 symbolic link 的功能,这个功能简单的说就是让我们可以用多个路径去访问同一个文件或者目录。比如说让 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一个文件。但 hard link 和 symbolic link 还是有区别的(废话)。
Hard link 表示,它和原文件名指向的是存储设备上同一个文件内容。就好像这个文件内容有多个文件名一样,每个文件名有相等地位。删除其中任何一个之后,事实上文件内容并不会被删除掉,仍然可以用其他的名称来访问这个文件。只有当最后一个指向这个文件内容的文件名被删除掉之后,文件内容才被删除。也就是说,一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别。需要注意的是,因为每个分区(partition)上都可能有相同的存储位置地址,所以 hard link 必须跟被 link 的文件在同一个分区上。另外,目录不支持 hard link。Symbolic link 也称 soft link,它类似于 Windows 里的快捷方式 .lnk 文件。它本身是一个单独的文件,而这个文件的内容是它所指向的文件的路径。一般的程序存取 symbolic link 时存取的并不是它本身的内容,而是它所指向的文件的内容。当某个文件被删除掉后,它的 symbolic link 就无法存取到这个文件了,因为文件本身已经被删除了。也就是说,一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西。Symbolic link 可以链接任何本地可以访问到的文件或者目录路径。
以上这些是我对 hard link 和 symbolic link 的理解,我试图用跟文件系统无关和尽量通俗易懂的语言来解释这两个概念。但如果你是一个软件开发者或者系统管理员或者仅仅是想知道更详细的东西,强烈建议你去看看这个帖子。
OK,概念解释清楚了。那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事实上是支持 hard link 和 symbolic link 的,虽然 Windows 里没有比较容易使用的相关工具,而且 Explorer 对待 symbolic link 也有很奇怪的行为。
在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个 hard link,用法倒是很简单:
fsutil hardlink create <新文件名> <现有文件名>
也可以使用 GNU utilities for Win32 中的 ln 来创建 hard link。这是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。
当然,如果你想在自己的程序里创建 hard link,那也是很容易的,只需要一个很简单的 API 函数:
BOOL CreateHardLink( LPCTSTR lpFileName, LPCTSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL。
对于 symbolic link,NTFS 只支持对目录的 symbolic link,微软把它称作 junction。但是对于文件的 symbolic link,微软也有提供解决方案,那就是快捷方式(Shortcut,.lnk 文件)。不过 symbolic link 和快捷方式不是一个层次上的东西,前者是底层文件系统的功能,后者是应用层的功能。
在“管理工具”中的“计算机管理”里的“磁盘管理”里我们可以将一个卷装载到一个 NTFS 卷上的某个空目录里,这实际上就是为被装载卷的根目录建立一个以该空目录名为名的 symbolic link。也可以用命令行工具 MOUNTVOL 来完成这项工作。
遗憾的是 Windows 并没有提供对 NTFS 的 symbolic link 完整支持的工具。“计算机管理”或者 MOUNTVOL 只能对某个卷的根目录创建 symbolic link,而不是对任意目录。幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 junction.exe 来全功能的完成对 NTFS symbolic link 的管理。当然,微软也还不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事。不过它的查看 symbolic link 信息的功能不如 junction,因为不支持通配符和子目录扫描。
需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为。那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别,删除这个 symbolic link 将会删除被 link 的目录下的所有文件!而著名的强大的方便的扩展性强的(原谅我在这里用了这么多修饰词,我确实太喜欢 TC 了。)文件管理工具 Total Commander 则没有这个问题。
文中的某些基本概念和知识来源于以下两个页面:
http://answers.google.com/answers/threadview?id=341355
http://phorum.study-area.org/viewtopic.php?t=12235
相信使用过Unix的朋友都会对符号链接印象深刻,通过符号链接,可以方便地创建指向文件系统中其他文件的快捷方式,这在很多时候能够给操作带来极大的便利。不过,在Windows系统中,想要实现类似的功能则麻烦得多,虽然微软自Windows 2000开始,便为NTFS卷引入了对名为Junction Point的symbolic link(符号链接)的支持,但是,在图形界面下往往工作不太正常,很多时候不得不使用插件以保证该功能能够使用。而且,Junction Point还有一个致命的缺陷,无论在Windows 2000 还是后续的Windows XP和Server 2003中,NTFS Junction Point只能被用于文件夹和卷,而不能用于文件。
在Windows Vista中,微软终于让NTFS卷支持可以指向文件的符号链接 (symbolic link),至少从这个角度说,Windows Vista提供了接近于Unix的功能,相信这可以取悦部分Unix爱好者。
在Windows Vista中创建符号链接 (symbolic link)
Windows Vista中专门提供了一个创建符号链接的工具,MkLink ,不过,只可在命令行中运行,而不是图形界面。
进入命令行
要使用MkLink工具创建符号链接,必须首先进入到命令行窗口,并需提升至管理员权限。
在开始菜单中右键单击命令提示符 (Command Prompt)图标,从弹出菜单中选择“以管理员运行 (Run as Administrator)”
MkLink命令的参数
在命令提示符下输入如下命令将显示该工具的相应格式与参数。
MkLink /?
创建指向文件的符号链接
要创建指向某个文件的符号链接,只需依循相应的命令,如下图所示,我们来创建一个指向MSPaint.exe,名为TestSymLink的符号链接。
MKLINK TestSymLink %SystemRoot%\system32\mspaint.exe
创建完成后,可以用Dir命令来查看一下:
删除符号链接
要删除该符号链接则更为简单,操作同删除文件类似,不过,需要注意的是,这里删除的只是符号链接,而非文件本身。
DEL TestSymLink