在Linux檔案系統中經常提及硬連結(Hard Link)和符號連結(Symbolic Link),Windows中也可以建立連結,但由於豐富的圖形介面操作,很少提及連結。Windows 的 NTFS 檔案系統支援三種連結:硬連結(Hard Link)、符號連結(Symbolic Link)和目錄連結(junction point),此外還有一個大家非常熟悉連結機制:快捷方式。
建立連結
建立連結可以透過 dos 命令 mklink 或者 powershell 中的New-Item 建立。
mklink命令的使用說明如下圖所示。預設是建立檔案符號連結,使用/D
引數則是建立目錄的符號連結,使用 /H
是建立硬連結,使用/J
是建立目錄聯結,也稱為軟連結(soft link)。
使用 powershell 建立連結的方式如下:
New-Item <連結路徑> -ItemType <連結型別> -Target <連結目標>
其中 ItemType 的取值可選:HardLink、SymbolicLink、Junction
幾種連結的區別
與 Linux 的檔案系統中的 inode 與 block 類似,在 NTFS 檔案系統中資料物件也賦予了獨一無二的檔案 ID 以及與之對應的檔案路徑,檔案路徑和檔案 ID 對應,檔案 ID 和資料物件繫結,最終才呈現為可供使用者開啟、編輯的檔案。
快捷方式(shortcut)
快捷方式以.lnk
檔案方式存在,檔案大小僅有幾百位元組,與原始檔案大小無關。適用於 Explorer 等應用程式,並非 NTFS 內建機制,從Win95開始得到支援。FAT32也支援。適用於檔案、目錄,只能使用絕對路徑。可以跨磁碟機代號,可以跨主機,可以使用UNC路徑、網路驅動器。
符號連結
符號連結是將自己連結到一個目標檔案或目錄的路徑上。當系統識別到符號連結時,它會跳轉到符號連結所指向的目標中去,而不改變此時的檔案路徑。
符號連結從Vista開始得到支援,NTFS內建機制。適用於檔案,目錄。可以理解為另一種形式的快捷方式(shortcut),檔案大小為0位元組和不佔用空間。可以使用相對/絕對路徑,可以跨磁碟機代號,跨主機,可以使用UNC路徑和網路驅動器。
硬連結
硬連結和符號連結的原理完全不同,符號連結是指向目標路徑的連結,而硬連結則是指向目標資料物件的連結。因為一個卷中的資料物件都有一個獨一無二檔案 ID,也可以說硬連結是指向目標檔案 ID 的連結。
硬連結從Windows NT4開始得到支援,是NTFS內建機制,FAT32不支援。只適用於檔案,只能使用絕對路徑。本身無檔案,不佔用額外空間。hardlink與targetfile必須位於同一卷,可以簡單理解成不能跨磁碟機代號。
目錄聯接
目錄聯接從Windows2000/XP開始得到支援,是NTFS內建機制。只適用於目錄。只能使用絕對路徑。目錄連結透過重分析點實現,目錄連結可以跨卷,但是不能跨主機。
詳細對比
幾種連結方式詳細比較如下表所示
shortcut | hard link | junction point | symbolic link | |
---|---|---|---|---|
建立方式 | 右鍵 -> 建立快捷方式 | mklink /H Link Target | mklink /J Link Target | mklink /D Link Target |
存在方式 | 以.lnk檔案方式存在,適用於Explorer等應用程式。非NTFS內建機制,從Win95開始得到支援。FAT32支援。 | NTFS內建機制,從Windows NT4開始得到支援。FAT32不支援。 | NTFS內建機制,從Windows2000/XP開始得到支援。是 NTFS 3.0 及以上檔案系統(Windows 2000 及以上系統)的特性,它是連結本地目錄(可跨卷)的訪問點,透過交接點的操作都會被系統對映到實際的目錄上。透過建立交接點,可以在保證一個目錄例項(目錄的一致性)的前提下,允許使用者或程式從本地檔案系統中的多個位置訪問此目錄。 | NTFS內建機制,從Vista開始得到支援。檔案型別是.SYMLINK |
適用範圍 | 同時適用於檔案、目錄,只能使用絕對路徑。 | 只適用於檔案,只能使用絕對路徑。 | 只適用於目錄。只能使用絕對路徑。即使建立junction point時使用了相對路徑,儲存到NTFS中時將隱式轉換成絕對路徑。 | 同時適用於檔案、目錄。這是一種超級shortcut,檔案大小為0位元組和不佔用空間。 |
使用限制 | 可以跨磁碟機代號,可以跨主機,可以使用UNC路徑、網路驅動器。 | hard link與targetfile必須位於同一volume,可以簡單理解成不能跨磁碟機代號。 | junction point必須與target directory位於同一local computer,可以簡單理解成不能跨主機, 在local computer範圍內,可以跨磁碟機代號。不能使用UNC路徑;假設Z是透過網路對映生成的磁碟機代號,同樣不適用於Z。 | 可以使用相對、絕對路徑。假設建立symbolic link時使用了相對路徑,儲存到NTFS中的就是相對路徑,不會隱式轉換成絕對路徑。可以跨磁碟機代號,可以跨主機,可以使用UNC路徑、網路驅動器。 |
移動能力 | 本身有檔案,可以複製,移動等操作。 | / | / | / |
檔案 | 檔案大小僅有幾百位元組, 跟原檔案大小無關,檔案型別是.lnk。 | 本身無檔案,為檔案建立多入口。由於不同的檔案指向的是同樣的資料,所以無論給同一個檔案建立多少個硬連結,他們佔整個卷的資料大小都是一樣的。 | 對交接點內檔案和子目錄的“建立、刪除、修改”等操作都被對映到對應的目錄中的檔案和子目錄上,對交接點的“複製、貼上、剪下、配置 ACL”,只會影響此交接點,在同一卷內移動交接點,只會影響此交接點,但在不同卷間移動交接點,會將此交接點轉換為正常目錄,並且交接點對應目錄下的所有內容都會被移動。 | 符號連結(Symlink,Softlink)是對檔案或目錄的引用,實際上符號連結本身是一個“記錄著所引用檔案或目錄的絕對或相對路徑”的特殊檔案,透過符號連結的操作都會被重定向到目標檔案或目錄。對符號連結和快捷方式的“讀、寫、遍歷”等操作都會被重定向到目標檔案或目錄,但對它們的“複製、刪除、移動、配置 ACL”等操作只針對自身。 |
關聯 | 刪除shortcut,不影響target。 | 在Explorer中刪除hard link,不影響targetfile。刪除target file,不影響hardlink。事實上由於hard link的語義,此時剩下的hardlink就是原始資料的唯一訪問點。只有當一個檔案 ID 對應的所有硬連結被刪除時,資料才真正被標記為刪除。 | 刪除target directory,junction point仍將存在,但失效了,變得不可用。這個很好理解,因為此時junction point指向不存在的目錄。 | 在Explorer中刪除symboliclink,不影響target。刪除target,symboliclink仍將存在,但失效了,變得不可用。它們可以像普通檔案一樣操作,但所有對符號連結的操作都實際作用於目標物件。符號連結對使用者而言是透明的,符號連結看上去和普通的檔案和資料夾沒有區別,操作方法也一模一樣(更類似於 Linux 的軟連結)。 |
連結的應用
- 硬連結:可以在不復制檔案的情況下,實現檔案的快速訪問以及檔案的備份,還可以防止重要檔案誤刪,因為刪除的是檔案的連結,而非檔案資料本身。
- 符號連結:可以把一個路徑對映到另一個路徑,或者指向遠端檔案或目錄,甚至可以透過網路連線到其他計算機上的檔案。
- 目錄聯接:實現路徑重定向,當訪問連結目錄時,系統會自動重定向到實際目錄,例如:Vista的"C:\Documents and Settings"是指向"C:\Users"的junctionpoint,這樣一些使用了硬編碼"C:\Documents and Settings"的老程式可以在Vista上正常工作。此外,還可以解決Windows檔案路徑長度限制帶來的問題(從 Windows 10 版本 1607 開始,可以透過設定登錄檔以及應用程式清單啟用長路徑)。
參考
- 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