在Linux文件系統(tǒng)中經(jīng)常提及硬鏈接(Hard Link)和符號鏈接(Symbolic Link),Windows中也可以創(chuàng)建鏈接,但由于豐富的圖形界面操作,很少提及鏈接。Windows 的 NTFS 文件系統(tǒng)支持三種鏈接:硬鏈接(Hard Link)、符號鏈接(Symbolic Link)和目錄鏈接(junction point),此外還有一個大家非常熟悉鏈接機制:快捷方式。
創(chuàng)建鏈接#
創(chuàng)建鏈接可以通過 dos 命令 mklink 或者 powershell 中的New-Item 創(chuàng)建。
mklink命令的使用說明如下圖所示。默認(rèn)是創(chuàng)建文件符號鏈接,使用/D
參數(shù)則是創(chuàng)建目錄的符號鏈接,使用 /H
是創(chuàng)建硬鏈接,使用/J
是創(chuàng)建目錄聯(lián)結(jié),也稱為軟鏈接(soft link)。

使用 powershell 創(chuàng)建鏈接的方式如下:
New-Item <鏈接路徑> -ItemType <鏈接類型> -Target <鏈接目標(biāo)>
其中 ItemType 的取值可選:HardLink、SymbolicLink、Junction
幾種鏈接的區(qū)別
與 Linux 的文件系統(tǒng)中的 inode 與 block 類似,在 NTFS 文件系統(tǒng)中數(shù)據(jù)對象也賦予了獨一無二的文件 ID 以及與之對應(yīng)的文件路徑,文件路徑和文件 ID 對應(yīng),文件 ID 和數(shù)據(jù)對象綁定,最終才呈現(xiàn)為可供用戶打開、編輯的文件。
快捷方式(shortcut)
快捷方式以.lnk
文件方式存在,文件大小僅有幾百字節(jié),與原始文件大小無關(guān)。適用于 Explorer 等應(yīng)用程序,并非 NTFS 內(nèi)置機制,從Win95開始得到支持。FAT32也支持。適用于文件、目錄,只能使用絕對路徑。可以跨盤符,可以跨主機,可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動器。
符號鏈接
符號鏈接是將自己鏈接到一個目標(biāo)文件或目錄的路徑上。當(dāng)系統(tǒng)識別到符號鏈接時,它會跳轉(zhuǎn)到符號鏈接所指向的目標(biāo)中去,而不改變此時的文件路徑。

符號鏈接從Vista開始得到支持,NTFS內(nèi)置機制。適用于文件,目錄。可以理解為另一種形式的快捷方式(shortcut),文件大小為0字節(jié)和不占用空間。可以使用相對/絕對路徑,可以跨盤符,跨主機,可以使用UNC路徑和網(wǎng)絡(luò)驅(qū)動器。
硬鏈接
硬鏈接和符號鏈接的原理完全不同,符號鏈接是指向目標(biāo)路徑的鏈接,而硬鏈接則是指向目標(biāo)數(shù)據(jù)對象的鏈接。因為一個卷中的數(shù)據(jù)對象都有一個獨一無二文件 ID,也可以說硬鏈接是指向目標(biāo)文件 ID 的鏈接。

硬鏈接從Windows NT4開始得到支持,是NTFS內(nèi)置機制,F(xiàn)AT32不支持。只適用于文件,只能使用絕對路徑。本身無文件,不占用額外空間。hardlink與targetfile必須位于同一卷,可以簡單理解成不能跨盤符。
目錄聯(lián)接
目錄聯(lián)接從Windows2000/XP開始得到支持,是NTFS內(nèi)置機制。只適用于目錄。只能使用絕對路徑。目錄鏈接通過重分析點實現(xiàn),目錄鏈接可以跨卷,但是不能跨主機。
詳細(xì)對比
幾種鏈接方式詳細(xì)比較如下表所示
| shortcut | hard link | junction point | symbolic link |
---|
創(chuàng)建方式 | 右鍵 -> 創(chuàng)建快捷方式 | mklink /H Link Target | mklink /J Link Target | mklink /D Link Target |
存在方式 | 以.lnk文件方式存在,適用于Explorer等應(yīng)用程序。非NTFS內(nèi)置機制,從Win95開始得到支持。FAT32支持。 | NTFS內(nèi)置機制,從Windows NT4開始得到支持。FAT32不支持。 | NTFS內(nèi)置機制,從Windows2000/XP開始得到支持。是 NTFS 3.0 及以上文件系統(tǒng)(Windows 2000 及以上系統(tǒng))的特性,它是鏈接本地目錄(可跨卷)的訪問點,通過交接點的操作都會被系統(tǒng)映射到實際的目錄上。通過建立交接點,可以在保證一個目錄實例(目錄的一致性)的前提下,允許用戶或程序從本地文件系統(tǒng)中的多個位置訪問此目錄。 | NTFS內(nèi)置機制,從Vista開始得到支持。文件類型是.SYMLINK |
適用范圍 | 同時適用于文件、目錄,只能使用絕對路徑。 | 只適用于文件,只能使用絕對路徑。 | 只適用于目錄。只能使用絕對路徑。即使創(chuàng)建junction point時使用了相對路徑,保存到NTFS中時將隱式轉(zhuǎn)換成絕對路徑。 | 同時適用于文件、目錄。這是一種超級shortcut,文件大小為0字節(jié)和不占用空間。 |
使用限制 | 可以跨盤符,可以跨主機,可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動器。 | hard link與targetfile必須位于同一volume,可以簡單理解成不能跨盤符。 | junction point必須與target directory位于同一local computer,可以簡單理解成不能跨主機, 在local computer范圍內(nèi),可以跨盤符。不能使用UNC路徑;假設(shè)Z是通過網(wǎng)絡(luò)映射生成的盤符,同樣不適用于Z。 | 可以使用相對、絕對路徑。假設(shè)創(chuàng)建symbolic link時使用了相對路徑,保存到NTFS中的就是相對路徑,不會隱式轉(zhuǎn)換成絕對路徑。可以跨盤符,可以跨主機,可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動器。 |
移動能力 | 本身有文件,可以復(fù)制,移動等操作。 | / | / | / |
文件 | 文件大小僅有幾百字節(jié), 跟原文件大小無關(guān),文件類型是.lnk。 | 本身無文件,為文件創(chuàng)建多入口。由于不同的文件指向的是同樣的數(shù)據(jù),所以無論給同一個文件創(chuàng)建多少個硬鏈接,他們占整個卷的數(shù)據(jù)大小都是一樣的。 | 對交接點內(nèi)文件和子目錄的“建立、刪除、修改”等操作都被映射到對應(yīng)的目錄中的文件和子目錄上,對交接點的“復(fù)制、粘貼、剪切、配置 ACL”,只會影響此交接點,在同一卷內(nèi)移動交接點,只會影響此交接點,但在不同卷間移動交接點,會將此交接點轉(zhuǎn)換為正常目錄,并且交接點對應(yīng)目錄下的所有內(nèi)容都會被移動。 | 符號鏈接(Symlink,Softlink)是對文件或目錄的引用,實際上符號鏈接本身是一個“記錄著所引用文件或目錄的絕對或相對路徑”的特殊文件,通過符號鏈接的操作都會被重定向到目標(biāo)文件或目錄。對符號鏈接和快捷方式的“讀、寫、遍歷”等操作都會被重定向到目標(biāo)文件或目錄,但對它們的“復(fù)制、刪除、移動、配置 ACL”等操作只針對自身。 |
關(guān)聯(lián) | 刪除shortcut,不影響target。 | 在Explorer中刪除hard link,不影響targetfile。刪除target file,不影響hardlink。事實上由于hard link的語義,此時剩下的hardlink就是原始數(shù)據(jù)的唯一訪問點。只有當(dāng)一個文件 ID 對應(yīng)的所有硬鏈接被刪除時,數(shù)據(jù)才真正被標(biāo)記為刪除。 | 刪除target directory,junction point仍將存在,但失效了,變得不可用。這個很好理解,因為此時junction point指向不存在的目錄。 | 在Explorer中刪除symboliclink,不影響target。刪除target,symboliclink仍將存在,但失效了,變得不可用。它們可以像普通文件一樣操作,但所有對符號鏈接的操作都實際作用于目標(biāo)對象。符號鏈接對用戶而言是透明的,符號鏈接看上去和普通的文件和文件夾沒有區(qū)別,操作方法也一模一樣(更類似于 Linux 的軟鏈接)。 |
鏈接的應(yīng)用
硬鏈接:可以在不復(fù)制文件的情況下,實現(xiàn)文件的快速訪問以及文件的備份,還可以防止重要文件誤刪,因為刪除的是文件的鏈接,而非文件數(shù)據(jù)本身。
符號鏈接:可以把一個路徑映射到另一個路徑,或者指向遠(yuǎn)程文件或目錄,甚至可以通過網(wǎng)絡(luò)連接到其他計算機上的文件。
目錄聯(lián)接:實現(xiàn)路徑重定向,當(dāng)訪問鏈接目錄時,系統(tǒng)會自動重定向到實際目錄,例如:Vista的"C:\Documents and Settings"是指向"C:\Users"的junctionpoint,這樣一些使用了硬編碼"C:\Documents and Settings"的老程序可以在Vista上正常工作。此外,還可以解決Windows文件路徑長度限制帶來的問題(從 Windows 10 版本 1607 開始,可以通過設(shè)置注冊表以及應(yīng)用程序清單啟用長路徑)。
參考
https://learn.microsoft.com/zh-cn/windows/win32/fileio/hard-links-and-junctions
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-7.4
https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later
https://blog.csdn.net/u010977122/article/details/86523123