比較 Windows 上四種不同的文件(夾)鏈接方式(NTFS 的硬鏈接、目錄聯接、符號鏈接,和大家熟知的快捷方式)

可能有很多小夥伴已經知道通過 mklink 命令來創建 NTFS 磁盤上的各種鏈接;當然,就算不知道 mklink 的鏈接,快捷方式應該每個人都知道吧。mklink 的選項有很多種,但你可能在其他文章中難以找到對這些不同選項的不同效果和使用限制的準確和統一描述。本文將介紹 Windows 系統中所有的鏈接方式,它們的優缺點、使用條件和坑。


This post is written in multiple languages. Please select yours:

{% include post-version-selector.html %}

不同的鏈接方式

Windows Vista 開始帶來了 NTFS 符號鏈接(Symbolic Link),Windows 2000 開始就有了 NTFS 重解析點(Reparse Point),更早的 Windows 95 就有了快捷方式(Shortcut),再往前到 Windows 3.5 還有硬鏈接(Hard Link),他們都能實現給你不同的路徑訪問同一個文件或文件夾的功能。

mklink

使用 mklink 命令,你可以創建“硬鏈接(Hard Link)”、“目錄聯接(Junction Point)”和“符號鏈接(Symbolic Link)”。

> mklink
創建符號鏈接。

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      創建目錄符號鏈接。默認爲文件
                符號鏈接。
        /H      創建硬鏈接而非符號鏈接。
        /J      創建目錄聯接。
        Link    指定新的符號鏈接名稱。
        Target  指定新鏈接引用的路徑
                (相對或絕對)

例如:

mklink /J current %APPDATA%\walterlv\packages\1.0.0

即在當前目錄創建了一個指向 %APPDATA%\walterlv\packages\1.0.0 的目錄聯接。

因爲創建目錄聯接不需要管理員權限,所以特別適合給桌面應用程序用來按版本管理某些包/工具集。有關使用 .NET/C# 來創建目錄聯接的方法,可以閱讀我的另一篇博客:

快捷方式

快捷方式是一個單純 Windows 操作系統用戶層面的功能,與 NTFS 文件系統沒有什麼關係。不過其也能實現鏈接到另一個文件的功能。使用快捷方式的程序太多了,幾乎每個安裝包都會考慮往桌面或開始菜單扔幾個快捷方式。

快捷方式的本質是一個 lnk 後綴的文件,這個文件裏面指向瞭如何打開目標文件或文件夾的一些參數,於是當在文件資源管理器中打開快捷方式時,就直接打開了目標文件或文件夾(當然,啓動一個程序可能是大多數用法)。

其他

重解析點(Reparse Point)自 NTFS v3.0(隨 Windows 2000 推出)開始便一直存在於 Windows 操作系統中。除了我們前面提到的可通過 mklink 創建的那三種外,還有其他種類:

  • Volume Mount Ppoints
  • Distributed Link Tracking(DLT)
  • Data Deduplication
  • Hierarchical Storage Management(HSM)
  • Native Structured Storage(NSS)
  • Unix Doman Socket(socket)
  • System Compression
  • OneDrive

比較

可能單單說名字,你不一定能明白什麼時候要用哪一種。於是我將這些鏈接的不同整理了出來貼在下面。

硬鏈接(Hard Link) 目錄聯接(Junction Point) 符號鏈接(Symbolic Link)
命令 mklink /H Link Target mklink /J Link Target mklink /D Link Target
作用 爲某文件創建別名,可讓不同的路徑對應同一個文件的數據。
鏈接到文件 ✔️
鏈接到文件夾 ✔️ ✔️
需要提升爲管理員權限 需要 不需要 通常需要 [坑1]
跨驅動器卷(盤符) ✔️(僅本地計算機) ✔️(包括 SMB 文件或路徑)
操作系統支持 Windows NT 3.1 開始支持
Windows 2000 開始有 API CreateHardLink()
Windows NT 6.0 開始能使用 mklink /H
Windows 2000+ Windows Vista+
可鏈接到不存在的目標 ✔️ ✔️
可鏈接到相對目錄 ❌(可以使用相對路徑創建,但創建完即變絕對路徑) ✔️
刪除方法 del rd rd / del
當鏈接被單獨刪除後 只有所有指向原始文件的硬鏈接和原始文件全部刪除後文件數據纔會被刪除。 Windows Vista 之後原始文件夾不受影響;Windows 2000/XP/2003 會導致原始子文件夾被刪除。 原始文件夾不受影響。
當原始文件被單獨刪除後 硬鏈接依然能正常訪問到文件的數據。 目錄聯接失效,指向不存在的目錄。 符號鏈接失效,指向不存在的目錄。

[坑1]: 在微軟的官方博客中已有說明:從 Windows 10 Insiders build 14972 開始,符號鏈接對開發者將不再需要管理員權限,這可以讓開發者像在 Linux 或 macOS 上一樣高效地工作。(通過如下圖所示的開關來決定此操作是否需要管理員權限,打開則無需管理員權限。)

開發者模式

額外的坑

如果你在開始菜單裏面有快捷方式指向了一個目錄聯接(Junction Point)中的文件,那麼在 Windows 10 操作系統更新後這個快捷方式便會消失。目前正在調查消失的原因,如果確認是目錄聯接的 bug 或者開始菜單的 bug,就將進展報告給微軟。

關於這個 bug,詳見:

一般來說,閱讀本文應該就理解了 mklink 的正確用法,也不應該會出現我另一篇博客中的情況:

另外,附我使用目錄聯接/符號鏈接的一些用途:


參考資料


我的博客會首發於 https://blog.walterlv.com/,而 CSDN 會從其中精選發佈,但是一旦發佈了就很少更新。

如果在博客看到有任何不懂的內容,歡迎交流。我搭建了 dotnet 職業技術學院 歡迎大家加入。

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://walterlv.blog.csdn.net/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章