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

Windows 6(Vista和Server 2008)支持正确的符号链接,可以通过CreateSymbolicLink函数创build。 但是,似乎没有相应的function来询问一个符号链接来获取链接目标的path。

我发现符号链接是重新parsing点的实现,因此可以使用重新parsing点函数来获取目标path。 但是,我需要使用重新分析点的头文件似乎与Windows驱动程序工具包 。 用VS2008设置这个工具包似乎是一个不重要的任务。

有没有一个很好的简单的function,我错过了获得链接的目标,或者我真的不得不build立一个Windows驱动程序开发环境只是编写代码来访问这些信息?

编辑:亚当Mitz想出了GetFinalPathNameByHandle的build议。 这个函数对于本地符号链接来说非常适用,但是似乎不能parsing远程链接(通过UNCpath)。

编辑2:在亚当的要求,这里是我已经尝试过的更多细节:

我最初去了FSCTL_GET_REPARSE_POINT / DeviceIoControl路由,但产生一个REPARSE_DATA_BUFFER结构。 定义此结构的头文件似乎只存在于Windows驱动程序工具包中。

GetFinalPathNameByHandle()在本地磁盘上存在链接( C:\...\link等)时正常工作。 奇怪的是,我发现我可以获得链接的句柄 – 从而得到目标 – 使用CreateFileW()是否指定了FILE_FLAG_OPEN_REPARSE_POINT标志,而不pipe目标文件是否存在。

当使用CreateFileW()GetFinalPathNameByHandle()查询远程链接( \\?\UNC\.... )时,事情就开始解开了。 如果指定FILE_FLAG_OPEN_REPARSE_POINT ,则GetFinalPathNameByHandle()始终返回链接path,而不是目标path。 如果没有指定FILE_FLAG_OPEN_REPARSE_POINT ,则返回目标path,但FILE_FLAG_OPEN_REPARSE_POINT是目标存在并与链接位于同一台计算机上。 如果链接指向另一台机器,则会出现networking权限错误。 如果链接指向一个本地不存在的文件,我得到一个文件未find的错误。

Solutions Collecting From Web of "我如何以编程方式访问Windows符号链接的目标path?"