因为开发一个项目,需要类似linux的ln -s 一样创建一个目录的快捷方式。但是windows xp下没有比较好的方法。于是google发现了这个小东西。Junction.
详见http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
一句话,Junction 就是windows下的ln -s.
用法:
To create a junction c:\Program-Files for “c:\Program Files”:
C:\>md Program-Files C:\>junction c:\Program-Files "c:\Program Files" To delete a junction, use the –d switch: junction -d c:\Program-Files
下载附件解到c:\wondows\system32下。执行上面的命令。即可。
不信任我的包的朋友,请到上面提到的microsoft.com的网址里下载也可以。
使用微软的Junction小工具在NTFS分区下实现文件和目录的符号链接
学过操作系统原理或者Linux的朋友应该都知道链接分为两种:一种是硬链接,一种是符号链接。Windows中的快捷方式就是符号链接在应用层的实现。不过他只完成了对文件的符号链接,对于目录来说,他的快捷方式仍然是一个文件,无法对其进行目录的操作。
(这里简单解释一下硬链接和符号链接的概念和区别:硬链接就是在目录文件里只增加一个目录项,指向目标文件。假设有A指向文件X,硬链接就是增加一个目录项B再指向X,打开A或B就直接打开了X;删除了A以后,X仍然在磁盘上,因为有B指向它;只有同时删除了A和B以后,X才真正被删除。而符号链接则增加了一个新的文件C,它的内容是X的路径,打开C的步骤是先打开C,读出X的路径,进而再打开X。删除了C,X还在;但如果删除了A,X就不在了)
NTFS引入了一项新技术Jucntion实现目录的符号链接,可惜在XP中并未提供相关的工具。但我们可以在Vista/7中看到Juntion功能的具体实现:Vista 的 C:\Documents and Settings 目录和 C:\Users 目录内容完全一样,如果对其中一个进行修改或者删除,那么另外一个也会发生变化,就仿佛是镜像一般。其实,C:\Documents and Settings 就是C:\Users 的一个符号链接,可能是由于微软觉得C:\Documents and Settings 太长不好记,于是才把缩短成C:\Users 的吧。但是又考虑到兼容性问题,才做了一个符号链接实现两个文件夹的同步。
=========================================================================================================
说了这么多废话,现在说说怎么在XP下完成目录的符号链接吧。首先先下载一个Junction的小工具(下载地址在文末),貌似是一个微软sysinternals的程序员无聊时的作品。这是一个命令行工具,语法是”junction LinkDirectory ExistingDirectory”,例如”junction d:\link c:\windows”,这样就在D盘建立了一个指向C:\windows的符号链接了。
有朋友可能要问了,这个工具有什么用呢?目前来看有以下几个用途,更多的用法期待大家来发现:
1.解决分区空间不够的问题。比如C盘满了,就把一个大文件夹(像是大的程序安装文件夹)简单地移动到D盘,然后在C盘创建一个和原来路径一样的符号链接。这样既没有兼容性问题,也解决的分区空间不够的问题。
2.整理同类的文件夹。比如我在C盘D盘E盘都有文件夹存放电影,我想把它整合到F盘里,便于管理和访问。就可以在F盘分别建立它们的符号链接,这样就可以在F盘里观看和管理电影啦~
3.便于同步操作。把要备份或者同步的目录符号链接到同一个目录Sync中,这样每次只需对Sync目录进行同步即可。
Just Enjoy It !
==========================================================================================================
附:Junction下载地址:
http://download.sysinternals.com/Files/Junction.zip
http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
参考文章:
http://www.buaaer.com/bbs/viewthread.php?tid=3183
http://www.blogjava.net/Unmi/archive/2007/11/26/163055.html
http://softbbs.pconline.com.cn/6346682.html
http://www.xxlinux.com/linux/article/unix/tigao/2009-04-14/16220.html
http://www.win7c.com/2009/0908/3681.html (Win7使用硬链接的例子)
http://wargrey.yo2.cn/2009/09/25/36608/ (文末的讨论很有趣)
符号链接、硬链接、快捷方式和Junctions
UNIX系统支持符号链接和硬链接,也许大多数人都是在学习UNIX时第一次接触这两个概念的。DOS当初过于简单,自然也不支持类似的概念。到了Windows的年代,产生了广为使用的快捷方式。到Windows NT的时候,微软逐步加入了对硬链接的支持。当然Windows中的实现还是不完全和UNIX一致。
1、UNIX中的符号链接(Symbolic links),可以链接目录或文件、可以跨文件系统。创建符号链接时,不会增加目标文件的引用计数。删除目标文件时,符号链接仍然存在,当然在使用它的时候会发现失效了。
3、Windows中的硬链接(Hard links),只能链接文件、不能链接目录,而且不能跨文件系统。创建链接时,也会增加目标文件的引用计数(MSDN说最大可创建的硬链接数为1023)。这个和UNIX的硬链接类似。不过只能在NTFS文件系统中使用。创建硬链接的API为CreateHardLink()。
4、Windows中的快捷方式(Shortcuts),可以指向文件或目录,也可以跨文件系统。符号链接仍然存在,当然在使用它的时候会发现失效了。它非常类似于UNIX的符号链接。
5、Windows中还有一个特殊的东西:Junctions。它只能指向目录,也可以跨本机的文件系统,但不能跨网络文件系统。它类似于UNIX下的Mount。不过也只能在NTFS文件系统中使用。MSDN的知识库文章“How to Create and Manipulate NTFS Junction Points”说明了如何用工具操纵Junctions,不过要在程序中使用Junctions,还是非常麻烦。这里有个很好的例子:Reparse points and junctions。
不管是符号链接、硬链接,还是Junctions、Mount,都会给用户带来一定程序的方便,也会给我们带来很多意想不到的麻烦。比如说,很多时候我们都需要遍历一个目录,并对遇到的目录或文件做些操作。有时我们是在遍历时修改文件的属性,有时是修改它的名字,有时是想改变其内容,还有的时候我们需要计算文件/目录的大小。符号链接、硬链接等概念会可能我们的操作带来不尽的烦恼。“Computing the size of a directory is more than just adding file sizes”还指出了更多需要注意的问题。
符号链接与硬链接有什么区别?
简单的说:硬连接记录的是目标的inode,符号连接记录的是目标的 path。
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有偏见了,总觉得它太差。
关于目录联接
mklink /j 创建目录联接
mklink /d 创建目录符号链接
另,mklink /j 只用于创建目录联接
最后,转载一些关于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. 2009/06/11 11:42 .. 2009/06/11 00:04 AppData 2009/06/11 00:04 Application Data [C:\Users\wclu\AppData\Roaming] 2009/06/11 00:04 Contacts 2009/06/11 00:04 Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies] 2009/06/11 10:05 Desktop 2009/06/11 00:04 Documents 2009/06/11 02:44 Downloads 2009/06/11 00:04 Favorites 2009/06/11 00:04 Links 2009/06/11 00:04 Local Settings [C:\Users\wclu\AppData\Local] 2009/06/11 00:04 Music 2009/06/11 00:04 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$RECYCLE.BIN 2009/06/11 13:08 3.txt [c:\a\1.txt] 2009/06/11 13:18 a [c:\a] 2009/06/11 12:54 Program Files 2009/06/11 09:58 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
2009/06/11 13:33
2009/06/11 13:34
2009/06/11 13:35
2009/06/11 12:54
2009/06/11 09:58
1 个文件 0 字节
5 个目录 31,089,442,816 可用字节
mklink 不加参数或加参数 /d 时,创建的链接文件为
当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为
从最开始的 “ >dir C:\Users\wclu /a ” 可以看出,微软自家使用的都是
四、链接文件的特性
刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。
符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)
当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。
如何实现符号链接文件的复制呢?
>copy /?
/L 如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。
>xcopy /? /B 对照链接目标复制符号链接本身
/* d:\1.txt 为
E:\>xcopy d:\1.txt e:\1.txt /b
目标 E:\1.txt 是文件名
还是目录名
(F = 文件,D = 目录)? F
D:\1.txt
复制了 1 个文件
/* d:\a 为
E:\>xcopy d:\a e:\a /B
目标 E:\a 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件
/* d:\b 为
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
2009/06/11 13:33
2009/06/11 13:34
2009/06/11 13:35
2009/06/11 09:58
1 个文件 0 字节
4 个目录 31,362,203,648 可用字节
可见采用xcopy命令并上参数 /B ,可以成功复制
符号链接文件的透明性
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。
NTFS 下的硬链接(hard link)与符号链接(symbolic link)
在 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
Windows Vista中的符号链接完全解析
相信使用过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
Junction Introduction
Windows 2000 and higher supports directory symbolic links, where a directory serves as a symbolic link to another directory on the computer. For example, if the directory D:\SYMLINK specified C:\WINNT\SYSTEM32 as its target, then an application accessing D:\SYMLINK\DRIVERS would in reality be accessing C:\WINNT\SYSTEM32\DRIVERS. Directory symbolic links are known as NTFS junctions in Windows. Unfortunately, Windows comes with no tools for creating junctions—you have to purchase the Win2K Resource Kit, which comes with the linkd program for creating junctions. I therefore decided to write my own junction-creating tool:Junction. Junction not only allows you to create NTFS junctions, it allows you to see if files or directories are actually reparse points. Reparse points are the mechanism on which NTFS junctions are based, and they are used by Windows’ Remote Storage Service (RSS), as well as volume mount points.
Please read this Microsoft KB article for tips on using junctions.
Notethat Windows does not support junctions to directories on remote shares.
If you want to view reparse information, the usage forJunction is the following:
Using Junction
Use junction to list junctions:
Usage: [-s]
-s Recurse subdirectories
Examples:
To determine if a file is a junction, specify the file name:
junction c:\test To list junctions beneath a directory, include the –s switch: junction -s c:\ To create a junction c:\Program-Files for "c:\Program Files": C:\>md Program-Files C:\>junction c:\Program-Files "c:\Program Files" To delete a junction, use the –d switch: junction -d c:\Program-Files
最新评论