2008-10-21 54 views
12

視窗6(Vista和Server 2008)支持適當的符號鏈接,可以通過CreateSymbolicLink函數創建。但是,似乎沒有相應的功能來詢問符號鏈接來獲取鏈接目標的路徑。如何以編程方式訪問Windows符號鏈接的目標路徑?

我已經發現了符號鏈接的重分析點的實現,因此重解析點功能,可用於獲取目標路徑。但我需要使用重新分析點的頭文件似乎與Windows Driver Kit。使用VS2008設置此工具包似乎是一項不重要的任務。

有沒有辦法,我已經錯過了獲得鏈接的目標,否則我真的要設置Windows驅動程序開發環境只是編寫代碼來訪問這些信息一個不錯的簡單功能?

編輯:亞當Mitz提出了GetFinalPathNameByHandle的建議。此功能對本地符號鏈接非常有用,但似乎無法解析遠程鏈接(通過UNC路徑)。

編輯2:在亞當的要求,這裏有更多的我已經試過細節:

我最初走下FSCTL_GET_REPARSE_POINT/DeviceIoControl路線,但產生一個REPARSE_DATA_BUFFER結構。定義此結構的頭文件似乎只存在於Windows驅動程序工具包中。

GetFinalPathNameByHandle()當鏈接存在於本地磁盤(C:\...\link等)時正常工作。奇怪的是,我發現我能獲得的句柄鏈接 - 並因此得到目標 - 用CreateFileW()FILE_FLAG_OPEN_REPARSE_POINT標誌是否被指定與否,無論目標文件是否存在。

CreateFileW()GetFinalPathNameByHandle()用於詢問遠程鏈接(\\?\UNC\....)時,事情開始解開。如果指定了FILE_FLAG_OPEN_REPARSE_POINT,則GetFinalPathNameByHandle()始終返回鏈接路徑,而不是目標路徑。如果沒有指定FILE_FLAG_OPEN_REPARSE_POINT,則返回目標路徑,但前提是目標存在並且與鏈接位於同一臺計算機上。如果鏈接指向另一臺機器,則會出現網絡權限錯誤。如果鏈接指向一個本地不存在的文件,我得到一個文件未找到的錯誤。

+0

請說明符號鏈接本身是否位於遠程服務器上(通過UNC),或者是符號鏈接目標是UNC路徑。 – 2008-10-24 02:54:07

+0

此外,我不認爲你需要DDK來閱讀重新分析點(沒有「解析點」這樣的東西)。請參閱CreateFile上的FILE_FLAG_OPEN_REPARSE_POINT標誌或DeviceIoControl的FSCTL_GET_REPARSE_POINT標誌。這些是否會有所幫助取決於你對我之前評論的回答。 – 2008-10-24 03:23:54

回答

13

GetFinalPathNameByHandle

最後一個路徑是 當一個路徑是完全 解決返回的路徑。例如,一個名爲 「C:\ tmp目錄\ MYDIR」 符號 鏈接指向 爲 「d:\ yourdir」,最後的文件系統 路徑爲 「d:\ yourdir」。