在Linux文件系統(tǒng)中經(jīng)常提及硬鏈接(Hard Link)和符號(hào)鏈接(Symbolic Link),Windows中也可以創(chuàng)建鏈接,但由于豐富的圖形界面操作,很少提及鏈接。Windows 的 NTFS 文件系統(tǒng)支持三種鏈接:硬鏈接(Hard Link)、符號(hào)鏈接(Symbolic Link)和目錄鏈接(junction point),此外還有一個(gè)大家非常熟悉鏈接機(jī)制:快捷方式。
創(chuàng)建鏈接#
創(chuàng)建鏈接可以通過(guò) dos 命令 mklink 或者 powershell 中的New-Item 創(chuàng)建。
mklink命令的使用說(shuō)明如下圖所示。默認(rèn)是創(chuàng)建文件符號(hào)鏈接,使用/D
參數(shù)則是創(chuàng)建目錄的符號(hào)鏈接,使用 /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ù)對(duì)象也賦予了獨(dú)一無(wú)二的文件 ID 以及與之對(duì)應(yīng)的文件路徑,文件路徑和文件 ID 對(duì)應(yīng),文件 ID 和數(shù)據(jù)對(duì)象綁定,最終才呈現(xiàn)為可供用戶打開(kāi)、編輯的文件。
快捷方式(shortcut)
快捷方式以.lnk
文件方式存在,文件大小僅有幾百字節(jié),與原始文件大小無(wú)關(guān)。適用于 Explorer 等應(yīng)用程序,并非 NTFS 內(nèi)置機(jī)制,從Win95開(kāi)始得到支持。FAT32也支持。適用于文件、目錄,只能使用絕對(duì)路徑??梢钥绫P符,可以跨主機(jī),可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動(dòng)器。
符號(hào)鏈接
符號(hào)鏈接是將自己鏈接到一個(gè)目標(biāo)文件或目錄的路徑上。當(dāng)系統(tǒng)識(shí)別到符號(hào)鏈接時(shí),它會(huì)跳轉(zhuǎn)到符號(hào)鏈接所指向的目標(biāo)中去,而不改變此時(shí)的文件路徑。
符號(hào)鏈接從Vista開(kāi)始得到支持,NTFS內(nèi)置機(jī)制。適用于文件,目錄??梢岳斫鉃榱硪环N形式的快捷方式(shortcut),文件大小為0字節(jié)和不占用空間??梢允褂孟鄬?duì)/絕對(duì)路徑,可以跨盤符,跨主機(jī),可以使用UNC路徑和網(wǎng)絡(luò)驅(qū)動(dòng)器。
硬鏈接
硬鏈接和符號(hào)鏈接的原理完全不同,符號(hào)鏈接是指向目標(biāo)路徑的鏈接,而硬鏈接則是指向目標(biāo)數(shù)據(jù)對(duì)象的鏈接。因?yàn)橐粋€(gè)卷中的數(shù)據(jù)對(duì)象都有一個(gè)獨(dú)一無(wú)二文件 ID,也可以說(shuō)硬鏈接是指向目標(biāo)文件 ID 的鏈接。
硬鏈接從Windows NT4開(kāi)始得到支持,是NTFS內(nèi)置機(jī)制,F(xiàn)AT32不支持。只適用于文件,只能使用絕對(duì)路徑。本身無(wú)文件,不占用額外空間。hardlink與targetfile必須位于同一卷,可以簡(jiǎn)單理解成不能跨盤符。
目錄聯(lián)接
目錄聯(lián)接從Windows2000/XP開(kāi)始得到支持,是NTFS內(nèi)置機(jī)制。只適用于目錄。只能使用絕對(duì)路徑。目錄鏈接通過(guò)重分析點(diǎn)實(shí)現(xiàn),目錄鏈接可以跨卷,但是不能跨主機(jī)。
詳細(xì)對(duì)比
幾種鏈接方式詳細(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)置機(jī)制,從Win95開(kāi)始得到支持。FAT32支持。 | NTFS內(nèi)置機(jī)制,從Windows NT4開(kāi)始得到支持。FAT32不支持。 | NTFS內(nèi)置機(jī)制,從Windows2000/XP開(kāi)始得到支持。是 NTFS 3.0 及以上文件系統(tǒng)(Windows 2000 及以上系統(tǒng))的特性,它是鏈接本地目錄(可跨卷)的訪問(wèn)點(diǎn),通過(guò)交接點(diǎn)的操作都會(huì)被系統(tǒng)映射到實(shí)際的目錄上。通過(guò)建立交接點(diǎn),可以在保證一個(gè)目錄實(shí)例(目錄的一致性)的前提下,允許用戶或程序從本地文件系統(tǒng)中的多個(gè)位置訪問(wèn)此目錄。 | NTFS內(nèi)置機(jī)制,從Vista開(kāi)始得到支持。文件類型是.SYMLINK |
適用范圍 | 同時(shí)適用于文件、目錄,只能使用絕對(duì)路徑。 | 只適用于文件,只能使用絕對(duì)路徑。 | 只適用于目錄。只能使用絕對(duì)路徑。即使創(chuàng)建junction point時(shí)使用了相對(duì)路徑,保存到NTFS中時(shí)將隱式轉(zhuǎn)換成絕對(duì)路徑。 | 同時(shí)適用于文件、目錄。這是一種超級(jí)shortcut,文件大小為0字節(jié)和不占用空間。 |
使用限制 | 可以跨盤符,可以跨主機(jī),可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動(dòng)器。 | hard link與targetfile必須位于同一volume,可以簡(jiǎn)單理解成不能跨盤符。 | junction point必須與target directory位于同一local computer,可以簡(jiǎn)單理解成不能跨主機(jī), 在local computer范圍內(nèi),可以跨盤符。不能使用UNC路徑;假設(shè)Z是通過(guò)網(wǎng)絡(luò)映射生成的盤符,同樣不適用于Z。 | 可以使用相對(duì)、絕對(duì)路徑。假設(shè)創(chuàng)建symbolic link時(shí)使用了相對(duì)路徑,保存到NTFS中的就是相對(duì)路徑,不會(huì)隱式轉(zhuǎn)換成絕對(duì)路徑。可以跨盤符,可以跨主機(jī),可以使用UNC路徑、網(wǎng)絡(luò)驅(qū)動(dòng)器。 |
移動(dòng)能力 | 本身有文件,可以復(fù)制,移動(dòng)等操作。 | / | / | / |
文件 | 文件大小僅有幾百字節(jié), 跟原文件大小無(wú)關(guān),文件類型是.lnk。 | 本身無(wú)文件,為文件創(chuàng)建多入口。由于不同的文件指向的是同樣的數(shù)據(jù),所以無(wú)論給同一個(gè)文件創(chuàng)建多少個(gè)硬鏈接,他們占整個(gè)卷的數(shù)據(jù)大小都是一樣的。 | 對(duì)交接點(diǎn)內(nèi)文件和子目錄的“建立、刪除、修改”等操作都被映射到對(duì)應(yīng)的目錄中的文件和子目錄上,對(duì)交接點(diǎn)的“復(fù)制、粘貼、剪切、配置 ACL”,只會(huì)影響此交接點(diǎn),在同一卷內(nèi)移動(dòng)交接點(diǎn),只會(huì)影響此交接點(diǎn),但在不同卷間移動(dòng)交接點(diǎn),會(huì)將此交接點(diǎn)轉(zhuǎn)換為正常目錄,并且交接點(diǎn)對(duì)應(yīng)目錄下的所有內(nèi)容都會(huì)被移動(dòng)。 | 符號(hào)鏈接(Symlink,Softlink)是對(duì)文件或目錄的引用,實(shí)際上符號(hào)鏈接本身是一個(gè)“記錄著所引用文件或目錄的絕對(duì)或相對(duì)路徑”的特殊文件,通過(guò)符號(hào)鏈接的操作都會(huì)被重定向到目標(biāo)文件或目錄。對(duì)符號(hào)鏈接和快捷方式的“讀、寫(xiě)、遍歷”等操作都會(huì)被重定向到目標(biāo)文件或目錄,但對(duì)它們的“復(fù)制、刪除、移動(dòng)、配置 ACL”等操作只針對(duì)自身。 |
關(guān)聯(lián) | 刪除shortcut,不影響target。 | 在Explorer中刪除hard link,不影響targetfile。刪除target file,不影響hardlink。事實(shí)上由于hard link的語(yǔ)義,此時(shí)剩下的hardlink就是原始數(shù)據(jù)的唯一訪問(wèn)點(diǎn)。只有當(dāng)一個(gè)文件 ID 對(duì)應(yīng)的所有硬鏈接被刪除時(shí),數(shù)據(jù)才真正被標(biāo)記為刪除。 | 刪除target directory,junction point仍將存在,但失效了,變得不可用。這個(gè)很好理解,因?yàn)榇藭r(shí)junction point指向不存在的目錄。 | 在Explorer中刪除symboliclink,不影響target。刪除target,symboliclink仍將存在,但失效了,變得不可用。它們可以像普通文件一樣操作,但所有對(duì)符號(hào)鏈接的操作都實(shí)際作用于目標(biāo)對(duì)象。符號(hào)鏈接對(duì)用戶而言是透明的,符號(hào)鏈接看上去和普通的文件和文件夾沒(méi)有區(qū)別,操作方法也一模一樣(更類似于 Linux 的軟鏈接)。 |
鏈接的應(yīng)用
硬鏈接:可以在不復(fù)制文件的情況下,實(shí)現(xiàn)文件的快速訪問(wèn)以及文件的備份,還可以防止重要文件誤刪,因?yàn)閯h除的是文件的鏈接,而非文件數(shù)據(jù)本身。
符號(hào)鏈接:可以把一個(gè)路徑映射到另一個(gè)路徑,或者指向遠(yuǎn)程文件或目錄,甚至可以通過(guò)網(wǎng)絡(luò)連接到其他計(jì)算機(jī)上的文件。
目錄聯(lián)接:實(shí)現(xiàn)路徑重定向,當(dāng)訪問(wèn)鏈接目錄時(shí),系統(tǒng)會(huì)自動(dòng)重定向到實(shí)際目錄,例如:Vista的"C:\Documents and Settings"是指向"C:\Users"的junctionpoint,這樣一些使用了硬編碼"C:\Documents and Settings"的老程序可以在Vista上正常工作。此外,還可以解決Windows文件路徑長(zhǎng)度限制帶來(lái)的問(wèn)題(從 Windows 10 版本 1607 開(kāi)始,可以通過(guò)設(shè)置注冊(cè)表以及應(yīng)用程序清單啟用長(zhǎ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