如何以编程方式访问Windows符号链接的目标路径?

时间:2008-10-21 10:38:38

标签: windows visual-studio-2008 symlink

Windows 6(Vista和Server 2008)支持正确的符号链接,可以通过CreateSymbolicLink功能创建。但似乎没有相应的函数来询问符号链接以获得链接目标的路径。

我发现符号链接是重新分析点的实现,因此重新分析点函数可用于获取目标路径。但是我需要使用重新分析点的头文件似乎带有Windows Driver Kit。使用VS2008设置此套件似乎是一项非常重要的任务。

是否有一个很好的简单函数,我错过了获取链接的目标,或者我是否真的必须设置一个Windows驱动程序开发环境只是为了编写代码来访问这些信息?

编辑:Adam 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,则返回目标路径,但仅当目标存在且与链接位于同一台计算机上时才会返回。如果链接指向另一台计算机,则会收到网络权限错误。如果链接指向本地 - 不存在的文件,则会收到文件未找到错误。

1 个答案:

答案 0 :(得分:13)

GetFinalPathNameByHandle

  

最终路径是路径   路径完全时返回   解决。例如,对于象征性的   名为“C:\ tmp \ mydir”的链接指向   到“D:\ yourdir”,最终的文件系统   路径是“D:\ yourdir”。