2008-10-21 57 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”。