從 Vista 以後,微軟將使用者檔案和使用者的軟體配置( AppData ) 明確劃分開,並且全部存放在使用者的使用者目錄下。
Linux早已這樣做了,並且在Linux中可將 home 掛載為獨立分割槽,而微軟顯然還沒學到家。使用者目錄依舊和系統目錄一起放在同一分割槽。
如何將使用者目錄移動到非系統分割槽?這是本文的出發點。但本文的重心不在於此,而是 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-8884D:\ 的目錄
- 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-8884D:\ 的目錄
- 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-FB51E:\ 的目錄
- 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等)都能直接作用於符號連結。用於讀寫檔案內容的命令將會直接訪問目標檔案。