在Windows XP下创建目录的符号链接 因为开发一个项目,需要类似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./Files/Junction.zip http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx 参考文章: http://www./bbs/viewthread.php?tid=3183 http://www./Unmi/archive/2007/11/26/163055.html http://softbbs.pconline.com.cn/6346682.html http://www./linux/article/unix/tigao/2009-04-14/16220.html http://www./2009/0908/3681.html (Win7使用硬链接的例子) http://wargrey./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,用了两个月感觉还不错,各方面表现还算凑和,基本上还算爽。 mklink 是何方神圣,值得专门作文讲述? 自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。 >dir C:\Users\wclu /a C:\Users\wclu 的目录 2009/06/11 11:42 <DIR> . 上述标红色的文件,便是符号链接了(上述文件并非C:\Users\wclu目录下全部文件) 。 Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。 二、mklink 用法 mklink 只能在命令提示符 “CMD” 中使用。 >mklink /? MKLINK [[/D] | [/H] | [/J]] Link Target /D 创建目录符号链接。黙认为文件 注:上述的符号链接等同于Linux中的软链接。 为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 1.txt。 创建文件链接 E:\>mklink 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 可见为文件创建链接时,必须是 “mklink 符号链接文件名 原文件名”的格式。 创建目录链接 虽然d:\a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。 E:\>mklink /d d:\a c:\a E:\>dir d: /a D:\ 的目录 2009/06/11 10:00 <DIR> $RECYCLE.BIN 当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。 三、mklink /d 与 makelink /j 的异同 从 mklink 的帮助中可以看到,两者皆可以创建目录链接。 细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。 一字之差,有何分别? 下面分别用这两种方式为同一目录创建链接: E:\>mklink /j d:\a c:\a E:\>mklink /d d:\b c:\a 下面显示D分区中的文件及目录列表: E:\>dir d: /a D:\ 的目录 2009/06/11 10:00 <DIR> $RECYCLE.BIN mklink 不加参数或加参数 /d 时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。 当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别: 从最开始的 “ >dir C:\Users\wclu /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。 四、链接文件的特性 刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。 符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制) >xcopy /? /B 对照链接目标复制符号链接本身 /* d:\1.txt 为<SYMLINK>型符号链接 */ /* d:\a 为<JUNCTION>型符号链接 */ /* d:\b 为<SYMLINKD>型符号链接 */ E:\>dir e: /a E:\ 的目录 2009/06/11 10:00 <DIR> $RECYCLE.BIN 可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。 符号链接文件的透明性 在 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,用法倒是很简单:
也可以使用 GNU utilities for Win32 中的 ln 来创建 hard link。这是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。 当然,如果你想在自己的程序里创建 hard link,那也是很容易的,只需要一个很简单的 API 函数:
前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 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 则没有这个问题。 文中的某些基本概念和知识来源于以下两个页面: 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 IntroductionWindows 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 JunctionUse 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 |
|
来自: sduwalker > 《Virtualization》