﻿# 介紹好用工具： Junction ( Windows 版的 Soft link )

玩過 Linux 的人都知道有個 [ln](https://man7.org/linux/man-pages/man1/ln.1.html) 指令可任意建立 link ( 包括 hard links 與 symbolic links )，這是個很好用的東西，不過在 Windows 環境卻很少聽人提起有 "link" 的概念，而 [Junction](http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx) 就是用來建立 "link" 的工具。

"NTFS 連接點" ( [NTFS junction point](http://en.wikipedia.org/wiki/NTFS_junction_point) ) 是 NTFS 檔案系統提供的一種能力，可以讓某一個**實體目錄**(Target) 直接 Link (連結) 到另一個 **對應的目錄**(Junction Directory)，這與建立「捷徑(ShortCut)」是個截然不同的概念。

你所建立的 "**NTFS 連接點**" 目錄跟你原本的目錄內容，完全一模一樣 (包括安全性設定)，因為實際上這兩個目錄下的檔案是「完全相同」的一份資料，只是透過了 "**NTFS 連接點**" 建立了兩個目錄之間的連結。

而建立 "**NTFS 連接點**" 最大的好處就是**這是一個「感覺」完全獨立的目錄**，對「檔案總管」或「任何其他的程式」來說，根本不知道這目錄到底是不是一個 NTFS 連接點，而可以直接進行檔案、目錄操作。

再者，有些舊有的程式只能讀取固定目錄下的資料，若因為 C 槽硬碟空間不夠而將資料搬移後，程式可能就無法運作了，這時就可以透過 [Junction](http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx) 工具幫你建立 "**NTFS 連接點**"，省時又省力！

Junction 的使用說明如下：

```
Junction v1.05 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2007 Mark Russinovich
Systems Internals - http://www.sysinternals.com

The first usage is for displaying reparse point information, and the
second usage is for creating or deleting a NTFS junction point:

usage: junction [-s] [-q] <file or directory>
       -q     Don't print error messages (quiet)

       -s     Recurse subdirectories

usage: junction [-d] <junction directory> [<junction target>]
       -d     Delete the specified junction
       example: junction d:\link c:\winnt
```

舉幾個簡單的例子。若你的實體目錄在 D:\\MyDocument 而你要建立一個 "**NTFS 連接點**" 到 C:\\Profiles\\User1\\MyDocs 目錄的話，就可以用以下指令完成：

```
junction c:\Profiles\User1\MyDocs "d:\tmp\My Documents"
```

這時你會得到以下訊息：

```
Junction v1.05 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2007 Mark Russinovich
Systems Internals - http://www.sysinternals.com

Created: c:\Profiles\User1\MyDocs
Targetted at: d:\tmp\My Documents
```

代表你已經成功建立 **C:\\Profiles\\User1\\MyDocs** 目錄，而這個目錄是一個 "**NTFS 連接點**"。從檔案總管中，你完全無法看出這目錄到底是「真實目錄」或是「NTFS 連接點」，但你可以透過「命令提示字元模式」以 dir 指令查看此目錄是不是一個 "**NTFS 連接點**" (如下圖示)。

![你可以透過「命令提示字元模式」以 dir 指令查看此目錄是不是一個 "NTFS 連接點" ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/04d26a731d6c4d861c49-image_3.png)

若要刪除 "**NTFS 連接點**" 我發現有三種方式，要是你選錯方式，你的資料就會全部不見，所以使用上要小心謹慎，不要因為偷懶就用檔案總管進行刪除動作：

1\. 使用標準的[Junction](http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx) 工具程式進行刪除 ( **建議用法** )

```
junction -d c:\Profiles\User1\MyDocs
```

2\. 使用檔案總管進行刪除 ( 將"**NTFS 連接點**" 目錄丟進「資源回收筒」 )，當你用了這招刪除，事實上只是將 "**NTFS 連接點**" 移到「資源回收筒」而已，所以 "**NTFS 連接點**" 其實是還在的，所以你的來源目錄裡的檔案還會存在，不過當你「清空資源回收筒」時，包含你的原本的目錄下所有檔案都會一併被刪除！

![將"NTFS 連接點" 目錄丟進「資源回收筒」](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0f4c64eb601d19cce9dd-image_6.png)

3\. 使用檔案總管進行刪除 ( 使用 Shift + Delete 直接刪除 )，這也是最無藥可救的方式 (其實有藥)，一次刪除殆盡，包含你的原本的目錄下所有檔案都會一併被刪除！

在特別提醒一點，如果你從 "**NTFS 連接點**" 的上層目錄開始刪除的話，你原本資料夾下的目錄一樣會消失喔。又如果你因為使用了 "**NTFS 連接點**" 而「忘記」有這件事還刪除此目錄的話，那真的算你倒楣了，檔案會全數消失！

如果不放心，還是建議各位不要使用，以免檔案遺失而不自知。不過對於一些罕見的使用情境，確實是一個很棒的解決方案。

**相關連結**

-   [Junction](http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx) - Sysinternals
-   [NTFS junction point](http://en.wikipedia.org/wiki/NTFS_junction_point)
-   [NTFS symbolic link](http://en.wikipedia.org/wiki/NTFS_symbolic_link)
