zoukankan      html  css  js  c++  java
  • windows7中的“mklink命令” 转

     

     

      从 Vista 以后,微软将用户文件和用户的软件配置( AppData ) 明确划分开,并且全部存放在使用者的用户目录下。

      Linux早已这样做了,并且在Linux中可将 home 挂载为独立分区,而微软显然还没学到家。用户目录依旧和系统目录一起放在同一分区。

      如何将用户目录移动到非系统分区?这是本文的出发点。但本文的重心不在于此,而是 mklink ,一个命令。

    一、何为 mklink
      mklink 是何方神圣,值得专门作文讲述?

      如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。

      mklink 便是用来创建符号链接的,这个命令并不知名,使用的人也不多。

    自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。

    >dir C:Userswclu /a
    驱动器 C 中的卷是 win7
    卷的序列号是 8CD0-A743

    1. C:Userswclu 的目录  
    2.   
    3. 2009/06/11 11:42    <DIR>          .  
    4. 2009/06/11 11:42    <DIR>          ..  
    5. 2009/06/11 00:04    <DIR>          AppData  
    6. 2009/06/11 00:04    <JUNCTION>     Application Data [C:UserswcluAppDataRoaming]  
    7. 2009/06/11 00:04    <DIR>          Contacts  
    8. 2009/06/11 00:04    <JUNCTION>     Cookies [C:UserswcluAppDataRoamingMicrosoftWindowsCookies]  
    9. 2009/06/11 10:05    <DIR>          Desktop  
    10. 2009/06/11 00:04    <DIR>          Documents  
    11. 2009/06/11 02:44    <DIR>          Downloads  
    12. 2009/06/11 00:04    <DIR>          Favorites  
    13. 2009/06/11 00:04    <DIR>          Links  
    14. 2009/06/11 00:04    <JUNCTION>     Local Settings [C:UserswcluAppDataLocal]  
    15. 2009/06/11 00:04    <DIR>          Music  
    16. 2009/06/11 00:04    <JUNCTION>     My Documents [C:UserswcluDocuments]  


     

    上述标红色的文件,便是符号链接了(上述文件并非C:Userswclu目录下全部文件) 。

    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:a1.txt拒绝访问。

    E:>mklink c:2.txt c:a1.txt
    为 c:2.txt <<===>> c:a1.txt 创建的符号链接

    可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。

    E:>mklink c:a1.txt d:3.txt
    当文件已存在时,无法创建该文件。

    E:>mklink d:3.txt c:a1.txt
    为 d:3.txt <<===>> c:a1.txt 创建的符号链接

    可见为文件创建链接时,必须是 “mklink 符号链接文件名   原文件名”的格式。

    创建目录链接
    E:>mklink /d c: d:a
    为 c: <<===>> d:a 创建的符号链接

    虽然d:a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。

    E:>mklink /d d:a c:a
    为 d:a <<===>> c:a 创建的符号链接

    E:>dir d: /a
    驱动器 D 中的卷是 soft
    卷的序列号是 BE86-8884

    D: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:08    <SYMLINK>      3.txt [c:a1.txt]  
    3. 2009/06/11 13:18    <SYMLINKD>     a [c:a]  
    4. 2009/06/11 12:54    <DIR>          Program Files  
    5. 2009/06/11 09:58    <DIR>          System Volume Information  
    6. 1 个文件              0 字节  
    7. 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: c:a
    为 d: <<===>> c:a 创建的符号链接

    下面显示D分区中的文件及目录列表:

    E:>dir d: /a
    驱动器 D 中的卷是 soft
    卷的序列号是 BE86-8884

    D: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:33    <SYMLINK>      1.txt [c:a1.txt]  
    3. 2009/06/11 13:34    <JUNCTION>     a [c:a]  
    4. 2009/06/11 13:35    <SYMLINKD>     b [c:a]  
    5. 2009/06/11 12:54    <DIR>          Program Files  
    6. 2009/06/11 09:58    <DIR>          System Volume Information  
    7. 1 个文件              0 字节  
    8. 5 个目录 31,089,442,816 可用字节  

    mklink 不加参数或加参数 /d 时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。

    当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:

     

    从最开始的 “ >dir C:Userswclu /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: 为<SYMLINKD>型符号链接 */
    E:>xcopy d: e: /B
    目标 E: 是文件名
    还是目录名
    (F = 文件,D = 目录)? D
    复制了 0 个文件

    E:>dir e: /a
    驱动器 E 中的卷是 data
    卷的序列号是 FEEE-FB51

    E: 的目录

    1. 2009/06/11 10:00    <DIR>          $RECYCLE.BIN  
    2. 2009/06/11 13:33    <SYMLINK>      1.txt [c:a1.txt]  
    3. 2009/06/11 13:34    <DIR>          a  
    4. 2009/06/11 13:35    <SYMLINKD>     b [c:a]  
    5. 2009/06/11 09:58    <DIR>          System Volume Information  
    6. 1 个文件              0 字节  
    7. 4 个目录 31,362,203,648 可用字节  

    可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。

    符号链接文件的透明性
    符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
    普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。

  • 相关阅读:
    例行更新,防止被踢
    C语言 遍历磁盘目录
    析构函数的调用
    数组学习笔记
    函数学习笔记
    c++语言 纯虚函数的使用
    c++语言 内联方法
    复制构造函数
    c++语言 覆盖成员函数
    面向对象程序设计
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3604926.html
Copyright © 2011-2022 走看看