|
在Windows XP下創(chuàng)建目錄的符號鏈接 因為開發(fā)一個項目,需要類似linux的ln -s 一樣創(chuàng)建一個目錄的快捷方式。但是windows xp下沒有比較好的方法。于是google發(fā)現(xiàn)了這個小東西。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下。執(zhí)行上面的命令。即可。 不信任我的包的朋友,請到上面提到的microsoft.com的網(wǎng)址里下載也可以。 使用微軟的Junction小工具在NTFS分區(qū)下實現(xiàn)文件和目錄的符號鏈接 學過操作系統(tǒng)原理或者Linux的朋友應該都知道鏈接分為兩種:一種是硬鏈接,一種是符號鏈接。Windows中的快捷方式就是符號鏈接在應用層的實現(xiàn)。不過他只完成了對文件的符號鏈接,對于目錄來說,他的快捷方式仍然是一個文件,無法對其進行目錄的操作。 (這里簡單解釋一下硬鏈接和符號鏈接的概念和區(qū)別:硬鏈接就是在目錄文件里只增加一個目錄項,指向目標文件。假設(shè)有A指向文件X,硬鏈接就是增加一個目錄項B再指向X,打開A或B就直接打開了X;刪除了A以后,X仍然在磁盤上,因為有B指向它;只有同時刪除了A和B以后,X才真正被刪除。而符號鏈接則增加了一個新的文件C,它的內(nèi)容是X的路徑,打開C的步驟是先打開C,讀出X的路徑,進而再打開X。刪除了C,X還在;但如果刪除了A,X就不在了) NTFS引入了一項新技術(shù)Jucntion實現(xiàn)目錄的符號鏈接,可惜在XP中并未提供相關(guān)的工具。但我們可以在Vista/7中看到Juntion功能的具體實現(xiàn):Vista 的 C:\Documents and Settings 目錄和 C:\Users 目錄內(nèi)容完全一樣,如果對其中一個進行修改或者刪除,那么另外一個也會發(fā)生變化,就仿佛是鏡像一般。其實,C:\Documents and Settings 就是C:\Users 的一個符號鏈接,可能是由于微軟覺得C:\Documents and Settings 太長不好記,于是才把縮短成C:\Users 的吧。但是又考慮到兼容性問題,才做了一個符號鏈接實現(xiàn)兩個文件夾的同步。 ========================================================================================================= 說了這么多廢話,現(xiàn)在說說怎么在XP下完成目錄的符號鏈接吧。首先先下載一個Junction的小工具(下載地址在文末),貌似是一個微軟sysinternals的程序員無聊時的作品。這是一個命令行工具,語法是"junction LinkDirectory ExistingDirectory",例如"junction d:\link c:\windows",這樣就在D盤建立了一個指向C:\windows的符號鏈接了。 有朋友可能要問了,這個工具有什么用呢?目前來看有以下幾個用途,更多的用法期待大家來發(fā)現(xiàn): 1.解決分區(qū)空間不夠的問題。比如C盤滿了,就把一個大文件夾(像是大的程序安裝文件夾)簡單地移動到D盤,然后在C盤創(chuàng)建一個和原來路徑一樣的符號鏈接。這樣既沒有兼容性問題,也解決的分區(qū)空間不夠的問題。 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系統(tǒng)支持符號鏈接和硬鏈接,也許大多數(shù)人都是在學習UNIX時第一次接觸這兩個概念的。DOS當初過于簡單,自然也不支持類似的概念。到了Windows的年代,產(chǎn)生了廣為使用的快捷方式。到Windows NT的時候,微軟逐步加入了對硬鏈接的支持。當然Windows中的實現(xiàn)還是不完全和UNIX一致。 1、UNIX中的符號鏈接(Symbolic links),可以鏈接目錄或文件、可以跨文件系統(tǒng)。創(chuàng)建符號鏈接時,不會增加目標文件的引用計數(shù)。刪除目標文件時,符號鏈接仍然存在,當然在使用它的時候會發(fā)現(xiàn)失效了。 3、Windows中的硬鏈接(Hard links),只能鏈接文件、不能鏈接目錄,而且不能跨文件系統(tǒng)。創(chuàng)建鏈接時,也會增加目標文件的引用計數(shù)(MSDN說最大可創(chuàng)建的硬鏈接數(shù)為1023)。這個和UNIX的硬鏈接類似。不過只能在NTFS文件系統(tǒng)中使用。創(chuàng)建硬鏈接的API為CreateHardLink()。 4、Windows中的快捷方式(Shortcuts),可以指向文件或目錄,也可以跨文件系統(tǒng)。符號鏈接仍然存在,當然在使用它的時候會發(fā)現(xiàn)失效了。它非常類似于UNIX的符號鏈接。 5、Windows中還有一個特殊的東西:Junctions。它只能指向目錄,也可以跨本機的文件系統(tǒng),但不能跨網(wǎng)絡文件系統(tǒng)。它類似于UNIX下的Mount。不過也只能在NTFS文件系統(tǒng)中使用。MSDN的知識庫文章“How to Create and Manipulate NTFS Junction Points”說明了如何用工具操縱Junctions,不過要在程序中使用Junctions,還是非常麻煩。這里有個很好的例子:Reparse points and junctions。 不管是符號鏈接、硬鏈接,還是Junctions、Mount,都會給用戶帶來一定程序的方便,也會給我們帶來很多意想不到的麻煩。比如說,很多時候我們都需要遍歷一個目錄,并對遇到的目錄或文件做些操作。有時我們是在遍歷時修改文件的屬性,有時是修改它的名字,有時是想改變其內(nèi)容,還有的時候我們需要計算文件/目錄的大小。符號鏈接、硬鏈接等概念會可能我們的操作帶來不盡的煩惱。“Computing the size of a directory is more than just adding file sizes”還指出了更多需要注意的問題。 符號鏈接與硬鏈接有什么區(qū)別? 簡單的說:硬連接記錄的是目標的inode,符號連接記錄的是目標的 path。 Windows下的符號鏈接換了新本本之后,不安于Windows Server 2003 R2了,之前也嘗試過Windows Vista / Windows 7 / Windows Server 2008,但最后都由于各種不爽的原因而放棄,主要還是電腦配置太差,這次終于有機會升級系統(tǒng)了,于是裝了Windows Server 2008 R2,用了兩個月感覺還不錯,各方面表現(xiàn)還算湊和,基本上還算爽。 mklink 是何方神圣,值得專門作文講述? 自從 Vista 以后,微軟便在 widows中 偷偷地用起了這個工具 。在用戶目錄下,可以看到很多很像快捷方式的文件,當然這是隱藏的,但卻不能打開,其實這便是符號鏈接。 >dir C:\Users\wclu /a C:\Users\wclu 的目錄 2009/06/11 11:42 <DIR> . 上述標紅色的文件,便是符號鏈接了(上述文件并非C:\Users\wclu目錄下全部文件) 。 Vista/Windows 7使用這些符號鏈接,是為了兼容XP等系統(tǒng)。 二、mklink 用法 mklink 只能在命令提示符 “CMD” 中使用。 >mklink /? MKLINK [[/D] | [/H] | [/J]] Link Target /D 創(chuàng)建目錄符號鏈接。黙認為文件 注:上述的符號鏈接等同于Linux中的軟鏈接。 為了試驗 mklink 的功能,我在 C分區(qū)中創(chuàng)建目錄 a ,并在目錄中存放文件 1.txt。 創(chuàng)建文件鏈接 E:\>mklink c:\2.txt c:\a\1.txt 可見為文件創(chuàng)建鏈接時,符號鏈接文件的擴展名要和原文件保持一致。 E:\>mklink c:\a\1.txt d:\3.txt E:\>mklink d:\3.txt c:\a\1.txt 可見為文件創(chuàng)建鏈接時,必須是 “mklink 符號鏈接文件名 原文件名”的格式。 創(chuàng)建目錄鏈接 雖然d:\a 目錄不存在,但依然可以創(chuàng)建鏈接,很好很強大。但打開鏈接時,提示錯誤。 E:\>mklink /d d:\a c:\a E:\>dir d: /a D:\ 的目錄 2009/06/11 10:00 <DIR> $RECYCLE.BIN 當把D分區(qū)中的鏈接文件刪除時,C分區(qū)中的文件和文件夾不受任何影響。 三、mklink /d 與 makelink /j 的異同 從 mklink 的幫助中可以看到,兩者皆可以創(chuàng)建目錄鏈接。 細心的同學可以發(fā)現(xiàn),前者是創(chuàng)建目錄鏈接,而后者是創(chuàng)建目錄聯(lián)接。 一字之差,有何分別? 下面分別用這兩種方式為同一目錄創(chuàng)建鏈接: E:\>mklink /j d:\a c:\a E:\>mklink /d d:\b c:\a 下面顯示D分區(qū)中的文件及目錄列表: E:\>dir d: /a D:\ 的目錄 2009/06/11 10:00 <DIR> $RECYCLE.BIN mklink 不加參數(shù)或加參數(shù) /d 時,創(chuàng)建的鏈接文件為<SYMLINK>型(<SYMLINKD>代表鏈接到目錄)。 當加參數(shù) /j 時,只能為目錄創(chuàng)建聯(lián)接,并且創(chuàng)建的聯(lián)接文件為<JUNCTION>型,兩種類型的鏈接文件有顯著區(qū)別: 從最開始的 “ >dir C:\Users\wclu /a ” 可以看出,微軟自家使用的都是<JUNCTION>型,至于為何,留待考證。 四、鏈接文件的特性 剛剛講述了如何用 mklink 創(chuàng)建鏈接文件,那么接下來重點講述如何鏈接文件的特性,既然是特性,那就是與眾不同了。 符號鏈接文件自身不能被 “復制”(只能通過特殊方法才能復制) >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命令并上參數(shù) /B ,可以成功復制 <SYMLINK> 型的符號鏈接文件,而<JUNCTION>型鏈接卻不能被復制。 符號鏈接文件的透明性 在 Linux 使用的 ext2 等文件系統(tǒng)里,都有 hard link 與 symbolic link 的功能,這個功能簡單的說就是讓我們可以用多個路徑去訪問同一個文件或者目錄。比如說讓 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一個文件。但 hard link 和 symbolic link 還是有區(qū)別的(廢話)。 Hard link 表示,它和原文件名指向的是存儲設(shè)備上同一個文件內(nèi)容。就好像這個文件內(nèi)容有多個文件名一樣,每個文件名有相等地位。刪除其中任何一個之后,事實上文件內(nèi)容并不會被刪除掉,仍然可以用其他的名稱來訪問這個文件。只有當最后一個指向這個文件內(nèi)容的文件名被刪除掉之后,文件內(nèi)容才被刪除。也就是說,一個文件的 hard link 跟此文件本來的名稱并沒有任何本質(zhì)上的區(qū)別。需要注意的是,因為每個分區(qū)(partition)上都可能有相同的存儲位置地址,所以 hard link 必須跟被 link 的文件在同一個分區(qū)上。另外,目錄不支持 hard link。Symbolic link 也稱 soft link,它類似于 Windows 里的快捷方式 .lnk 文件。它本身是一個單獨的文件,而這個文件的內(nèi)容是它所指向的文件的路徑。一般的程序存取 symbolic link 時存取的并不是它本身的內(nèi)容,而是它所指向的文件的內(nèi)容。當某個文件被刪除掉后,它的 symbolic link 就無法存取到這個文件了,因為文件本身已經(jīng)被刪除了。也就是說,一個文件的 symbolic link 跟此文件的文件名或者內(nèi)容都是完全不同的兩個東西。Symbolic link 可以鏈接任何本地可以訪問到的文件或者目錄路徑。 以上這些是我對 hard link 和 symbolic link 的理解,我試圖用跟文件系統(tǒng)無關(guān)和盡量通俗易懂的語言來解釋這兩個概念。但如果你是一個軟件開發(fā)者或者系統(tǒng)管理員或者僅僅是想知道更詳細的東西,強烈建議你去看看這個帖子。 OK,概念解釋清楚了。那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事實上是支持 hard link 和 symbolic link 的,雖然 Windows 里沒有比較容易使用的相關(guān)工具,而且 Explorer 對待 symbolic link 也有很奇怪的行為。 在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 這個復雜的命令來創(chuàng)建一個 hard link,用法倒是很簡單:
也可以使用 GNU utilities for Win32 中的 ln 來創(chuàng)建 hard link。這是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以創(chuàng)建 hard link 也可以創(chuàng)建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。 當然,如果你想在自己的程序里創(chuàng)建 hard link,那也是很容易的,只需要一個很簡單的 API 函數(shù):
前兩個參數(shù)的意思就不用解釋了,最后一個參數(shù)的用途暫時保留,必須為 NULL。 對于 symbolic link,NTFS 只支持對目錄的 symbolic link,微軟把它稱作 junction。但是對于文件的 symbolic link,微軟也有提供解決方案,那就是快捷方式(Shortcut,.lnk 文件)。不過 symbolic link 和快捷方式不是一個層次上的東西,前者是底層文件系統(tǒng)的功能,后者是應用層的功能。 在“管理工具”中的“計算機管理”里的“磁盤管理”里我們可以將一個卷裝載到一個 NTFS 卷上的某個空目錄里,這實際上就是為被裝載卷的根目錄建立一個以該空目錄名為名的 symbolic link。也可以用命令行工具 MOUNTVOL 來完成這項工作。 遺憾的是 Windows 并沒有提供對 NTFS 的 symbolic link 完整支持的工具。“計算機管理”或者 MOUNTVOL 只能對某個卷的根目錄創(chuàng)建 symbolic link,而不是對任意目錄。幸運的是我們可以使用 Sysinternals 提供的帶有源代碼的免費命令行工具 junction.exe 來全功能的完成對 NTFS symbolic link 的管理。當然,微軟也還不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一個命令行工具 linkd.exe 來完成這件事。不過它的查看 symbolic link 信息的功能不如 junction,因為不支持通配符和子目錄掃描。 需要注意的是,Explorer 對待 symbolic link 有一個很奇怪的行為。那就是,在 Explorer 里一個 symbolic link 跟被它 link 的目錄沒有區(qū)別,刪除這個 symbolic link 將會刪除被 link 的目錄下的所有文件!而著名的強大的方便的擴展性強的(原諒我在這里用了這么多修飾詞,我確實太喜歡 TC 了。)文件管理工具 Total Commander 則沒有這個問題。 文中的某些基本概念和知識來源于以下兩個頁面: Windows Vista中的符號鏈接完全解析 相信使用過Unix的朋友都會對符號鏈接印象深刻,通過符號鏈接,可以方便地創(chuàng)建指向文件系統(tǒng)中其他文件的快捷方式,這在很多時候能夠給操作帶來極大的便利。不過,在Windows系統(tǒng)中,想要實現(xiàn)類似的功能則麻煩得多,雖然微軟自Windows 2000開始,便為NTFS卷引入了對名為Junction Point的symbolic link(符號鏈接)的支持,但是,在圖形界面下往往工作不太正常,很多時候不得不使用插件以保證該功能能夠使用。而且,Junction Point還有一個致命的缺陷,無論在Windows 2000 還是后續(xù)的Windows XP和Server 2003中,NTFS Junction Point只能被用于文件夾和卷,而不能用于文件。 在Windows Vista中,微軟終于讓NTFS卷支持可以指向文件的符號鏈接 (symbolic link),至少從這個角度說,Windows Vista提供了接近于Unix的功能,相信這可以取悅部分Unix愛好者。 在Windows Vista中創(chuàng)建符號鏈接 (symbolic link) Windows Vista中專門提供了一個創(chuàng)建符號鏈接的工具,MkLink ,不過,只可在命令行中運行,而不是圖形界面。 進入命令行 要使用MkLink工具創(chuàng)建符號鏈接,必須首先進入到命令行窗口,并需提升至管理員權(quán)限。 在開始菜單中右鍵單擊命令提示符 (Command Prompt)圖標,從彈出菜單中選擇“以管理員運行 (Run as Administrator)” ![]() MkLink命令的參數(shù) 在命令提示符下輸入如下命令將顯示該工具的相應格式與參數(shù)。 MkLink /? ![]() 創(chuàng)建指向文件的符號鏈接 要創(chuàng)建指向某個文件的符號鏈接,只需依循相應的命令,如下圖所示,我們來創(chuàng)建一個指向MSPaint.exe,名為TestSymLink的符號鏈接。 MKLINK TestSymLink %SystemRoot%\system32\mspaint.exe ![]() 創(chuàng)建完成后,可以用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 |
|
|