NTFS重解析點

NTFS重解析點（NTFS reparse point），微軟官方也譯作重新分析點、重新剖析點、重新分析指標，是NTFS文件系統中的一種對象類型。它自Windows 2000起的NTFS v3.0版本以上開始受支援。重解析點提供一種擴展NTFS文件系統的方法。一個重解析點包含一個重解析標籤和數據，文件系統過濾器（file system filter）可以按標籤解讀它。微軟提供了幾個默認標籤，包括NTFS符號連結、NTFS目錄交接點和NTFS卷掛載點。另外，在Windows 2000的分層存儲管理中，重解析點被用作已移動文件的占位符。此外，它也可以被用作硬連結，並且不僅限於指向同分卷中的文件，還可以指向任何本地分卷中的目錄。

## 設計

一般情況：

- 硬連結：連結到一個文件（MFT記錄）。只要存在至少一個指向它的連結，數據會保持可用。
- 軟連結：連結到文件名（文件路徑）。

### 軟連結

Windows Vista支持新的符號連結能力。它取代了Windows 2000和Windows XP中的NTFS目錄交接點。它的設計目的是幫助遷移和提升與UNIX作業系統的應用程式的兼容性。不同於NTFS目錄交接點，符號連結也可以指向一個文件或遠程SMB網路路徑。此外，NTFS符號連結提供了跨文件系統的連結支持。但是，啟用跨主機的符號連結功能需要遠程系統也支持它，這使支持限制在Windows Vista及更高版本的Windows作業系統。

- NTFS符號連結（SYMLINK）：本地或遠程，相對或絕對SMB文件或路徑。Windows Server 2008使用軟連接重定向 `\Users\All Users\ -> \ProgramData\`。符號連結可以指向不存在的目標，因為作業系統不會檢查目標是否存在。使用 `mklink` 或 `mklink /D` 時，相對符號連結僅限於單個卷。
- NTFS目錄交接點，也稱軟連結：可用於同一台電腦的同一個卷或不同卷的目錄的連結。不能用於對文件的連接。底層用重解析點實現。使用 `mklink /J` 創建 junction 點後，使用Windows資源管理器刪除它時，如果使用了Shift+Delete，將立即刪除目標文件 (Windows 2000/XP/2003)。`del my_junction` 命令不應該使用，因為它會刪除目標目錄中的所有文件。在Windows Vista及更高版本中，使用junction刪除NTFS目錄交接點是安全的。
- 卷裝載點（Volume Mount Points）：卷裝載點和前2者類似，只是更進一層：它能創建對整個卷的連結。
- 遠程存儲伺服器（Microsoft Remote Storage Server）：Windows 2000的這個特性能利用一些規則來移除NTFS卷上不常用的文件，放到存檔介質里（比如CD-RW或磁帶）。當它把文件移出到「線下」或「半線下」的存儲介質上時，RSS會自動創建指向這個存檔文件的重解析點，以備日後使用。

### 硬連結

NTFS 硬連結：從Windows NT 4開始：多個路徑指向同一驅動器上的文件。從Windows 2000開始，Windows API包括一個 `CreateHardLink()` 函數來創建硬連結，並且可用 `DeleteFile()` 移除。所有Windows NT版本都可以使用 `GetFileInformationByHandle()` 來確定一個文件已關聯的硬連結數量。硬連結需要NTFS分區。運行在Windows上的類Unix仿真或軟體兼容層（如Cygwin和基於UNIX應用程式的子系統）允許在Windows上使用POSIX接口。大多數現代作業系統不允許硬連結目錄，以避免無限遞歸目錄；而且，硬連結目錄可能導致父目錄的條目不一致；通常使用符號連結和NTFS目錄交接點達到此目的。硬連結只能對同一文件系統上的文件創建。如果需要創建到另一文件系統的連結，應該使用符號連結。硬連結可以使用 `mklink /H` 命令創建。

硬連結使用與原文件相同的MFT記錄。添加一個硬連結會創建一個新的文件名屬性並增加硬連結計數器（每個新創建的文件+1）。刪除一個硬連結會移除相應的文件名並將硬連結計數器-1。當計數器歸零時，文件系統將刪除該文件、釋放其占用的磁碟空間及其MFT記錄。所有名稱屬性是獨立的，因此刪除、移動或重命名文件不會影響其他硬連結。

## 特性

### 卷掛載點

NTFS卷掛載點類似Unix掛載點，將另一個文件系統的根附加到一個目錄。在NTFS中，這允許額外的文件系統不逐一占用驅動器號（如 C:、D:）並掛載。

如果一個卷被掛在到另一個卷的現有目錄上，該目錄以前列出的內容將被隱藏，已掛載卷的根目錄將取代它。已掛載卷仍然有自己單獨分配的驅動器號。文件系統不允許卷被手動互相掛載。卷掛載點可以持久或非持久存在，兩者區別是系統重啟後是否會自動重新掛載。

已掛載卷可能使用非NTFS的文件系統，並可能有自己的安全設置和根據遠程文件系統策略重新映射的訪問權限。

### 目錄交接點

NTFS目錄交接點類似卷掛載點，但引用目標為文件系統中的其他目錄而非其他卷。舉例來說，目錄 `C:\exampledir` 有一個目錄junction屬性，其包含到 `D:\linkeddir` 的連結，因此當它被使用者模式的應用程式訪問時，將會自動引用 `D:\linkeddir` 目錄。此功能在概念上類似Unix中對目錄的符號連結，除了NTFS中的目標必須始終是另一個目錄（典型的Unix文件系統允許符號連結的目標是任何類型的文件）。

目錄交接點（可以在命令行提示符中使用 MKLINK /J junctionName targetDirectory 創建，以及用 RMDIR junctionName 移除）是持久的，並在伺服器側解析，它們與本地文件系統或掛載內容所在的父卷共享相同的安全領域；不過目錄交接點本身可能有不同的安全設置。取消一個目錄交接點連結不會刪除目標目錄中的文件。

某些目錄交接點在Windows Vista上已默認安裝，目的是保證對以前Windows版本的兼容性，例如系統分區根目錄中的Documents and Settings就是連結到同個卷根目錄中的的Users物理目錄。不過它在默認情況下是隱藏的，並且設定了安全設置以要求Windows文件資源管理器拒絕在外殼和大多數應用程式中打開它，除了本地內置的SYSTEM使用者或本地管理員組（這兩個使用者帳戶用於在系統中安裝軟體）。這個額外的安全性限制是為了避免使用者誤入此目錄和看到、誤以為並刪除明顯重複的文件。目錄交接點的語義不同於硬連結，對目標內容和引用容器本身都不存在引用計數。

目錄交接點是一種軟連結（它們可以持久存在，哪怕目標目錄被刪除），可以作為一種有限的符號連結使用（對目標位置有所約束），但它是一個優化的版本，重解析點的設計允許更快地處理它，比NTFS符號連結具有更小的系統開銷，並且可以在伺服器側解析（當發現於遠程共享目錄時）。

### 符號連結

符號連結（或軟連結）在Windows Vista中被引入。符號連結在客戶端側解析。因此當符號連結被共享時，目標受到客戶端而非伺服器的訪問限制。

符號連結的創建可以指向文件（用 MKLINK 符號連結 目標文件 創建）或目錄（用 MKLINK /D 符號連結 目標目錄 創建），但不同於Unix符號連結，創建連結時必須提供連結的類型。符號連結創建時不需要目標存在或可用：在符號連結可用時才會檢查可用性，NTFS也會在那時檢查類型（文件/目錄）是否正確；如果現有目標的類型錯誤，將會返回「找不到」錯誤。

它們還可引用遠程主機上的共享目錄或文件，以及共享項目錄中的子目錄：它們的目標不會立即掛載，只在使用 `OpenFile()` 或 `CreateFile()` API時臨時請求。

### 分布式連結跟蹤（DLT）

分布式連結跟蹤允許應用程式跟蹤文件、快捷方式和OLE連結，即使它已被重命名或移動到同個機器、域或工作組中的另一個分卷。跟蹤實現為一個系統服務，使用對象標識符（OID）的索引存儲在一個元文件中。當應用程式請求跟蹤一個文件或目錄時，跟蹤服務創建指向該文件的OID記錄。在文件被重命名、複製或移動到一個NTFS v3分卷時，對象ID也將被複製。因此跟蹤服務最終能找到目標文件。

### 單實例存儲（SIS）

當多個目錄有不同但類似的文件時，這些文件可能有著相同的內容。單實例存儲允許相同的文件被合併為一個文件，並創建一個到合併後文件的引用。SIS包括：一個文件系統篩選器，它管理複製、修改和合併文件；一個使用者空間服務（或稱groveler），它搜索相同並需要合併的文件。SIS的主要設計目的是遠程安裝的伺服器，其存在的多個安裝鏡像可能包含許多相同的文件，SISK可以合併這些。不同於硬連結，每個文件仍然是不同的；對一個副本的更改不會改變其他的副本。這類似於寫時複製，但那個技術是記憶體複製並未真正完成，直至副本被修改。

### 分層存儲管理（HSM）

分層存儲管理是一種轉移文件的手段，它根據文件熱度將數據在普通與昂貴的存儲介質間轉移。在下次訪問該文件時，該文件的重解析點會確定所需的存儲介質並從那裡檢索。citation needed

### 原生結構化存儲（NSS）

NSS原是ActiveX文檔存儲技術，它已被微軟停止使用。它允許ActiveX文檔存儲在ActiveX內部使用的多流格式中。NSS文件系統篩選器可以被加載並處理透明傳輸到應用該程序的多個流，並在文件被傳輸到非NTFS格式的磁碟卷時將多個流變為單個流。

## Windows Vista（及其後）的默認文件夾位置變化

與Windows XP（Windows NT 5.x）相比，在Windows 7、Windows 10等作業系統（Windows NT 6.x/Windows NT 10.x）中，存放使用者數據（user data）和系統數據（system data）的默認文件夾位置發生變化。例如，在Windows XP中存放使用者數據的文件為%SystemDrive%\Documents and Settings；在Windows 7中則為%SystemDriver%\User。這樣的變化無疑對以前應用程式能否在Windows 7下順利運行帶來兼容性問題。為了最大程度地保證對以前在Windows XP運行的程序的兼容性，在Windows 7中採用了junction points（連接點）技術。通過這個技術，原來在Windows XP下運行的程序對%SystemDrive%\Documents and Settings文件夾下的數據存取操作，能自動地更改到%SystemDriver%\User文件夾。

xp、windows2003中的路徑｜win7、windows2008中的路徑

\Documents and Settings｜\Users

\Documents and Settings\Default User或%LOGONSERVER%\NETLOGON\Default User｜\Users\Default 或%LOGONSERVER%\NETLOGON\Default

\Documents and Settings\\My Documents｜\Users\\Documents

\Documents and Settings\\My Documents\My Pictures｜\Users\\Pictures

\Documents and Settings\\My Documents\My Music｜\Users\\Music

\Documents and Settings\\Favorites｜\Users\\Favorites

N/A｜\Users\\Contacts

N/A｜\Users\\Downloads

N/A｜\Users\\SavedGames

\Documents and Settings\\Application Data｜\Users\\AppData\Roaming

\Documents and Settings\\Local Settings\Application Data｜\Users\\AppData\Local

\Documents and Settings\\Start Menu｜\Users\\AppData\Roaming\Microsoft\Windows\Start Menu

\Documents and Settings\All Users｜\Users\Public

\Documents and Settings\All Users\Start Menu｜\ProgramData\Microsoft\Windows\Start Menu

\Documents and Settings\All Users\Desktop｜\Users\Public\Desktop

## 編程解析

重解析點tag是個DWORD，為獲取它，使用FindFirstFile函數，如果輸出參數的dwFileAttributes結構域包含了FILE_ATTRIBUTE_REPARSE_POINT 屬性，那麼dwReserved0結構域就是重解析點的tag值。

為判斷文件系統是否支持重解析點，調用GetVolumeInformation函數檢查FILE_SUPPORTS_REPARSE_POINTS比特標誌。

DeviceIoControl函數可以設置、修改、獲取、刪除重解析點。

GetFileAttributes函數可判斷一個文件或目錄是否包含重解析點。

CreateFile函數帶著FILE_FLAG_OPEN_REPARSE_POINT，可以打開一個重解析點文件。

## 外部連結

- Reparse Point Support in Windows 2000-Based Clusters
- Reparse Points in the Microsoft Developer Network (MSDN) Library