zoukankan      html  css  js  c++  java
  • 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等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。


     

  • 相关阅读:
    spring boot使用自定义注解+AOP实现对Controller层指定方法的日志记录
    spring事务管理中,注解方式和xml配置方式优先级谁高?
    synchronized修饰类中不同方法,调用的时候方法互斥吗
    java(spring boot)实现二维码生成(可以插入中间log和底部文字)
    java借助Robot给微信好友自动发消息(可发送表情包)
    js中Map类型的使用
    【转】Intellij笔记
    Tomcat6.0webappsevopWEB-INFclasses (系统找不到指定的路径)
    多线程多进程之其他
    文件操作
  • 原文地址:https://www.cnblogs.com/rangeon/p/1807087.html
Copyright © 2011-2022 走看看