Windows 6 (Vista和Server 2008)支持适当的符号链接,可以通过CreateSymbolicLink函数创建。但是似乎没有相应的函数来查询符号链接以获取链接目标的路径。
我发现符号链接是重解析点的一种实现方式,因此可以使用重解析点函数来获取目标路径。但是,我需要使用重解析点的头文件似乎随Windows Driver Kit一起提供。在VS2008中设置这个kit似乎是一个不容易的任务。
是否有我错过的简单好用的函数来获取链接的目标,还是我真的必须设置一个Windows驱动程序开发环境才能编写代码访问这些信息?
编辑:Adam Mitz提出了GetFinalPathNameByHandle的建议。该函数对于本地符号链接非常有效,但似乎无法解决通过UNC路径解析远程链接的问题。
编辑2:根据Adam的要求,以下是我尝试过的更多细节:
我最初采用了FSCTL_GET_REPARSE_POINT / DeviceIoControl方法,但这会得到一个REPARSE_DATA_BUFFER结构。定义此结构的标头似乎仅存在于Windows Driver Kit中。
当链接存在于本地磁盘(如C:\ ... \ link等)时,GetFinalPathNameByHandle()函数运行良好。有趣的是,我发现无论是否指定了FILE_FLAG_OPEN_REPARSE_POINT标志,无论目标文件是否存在,都可以使用CreateFileW()获取链接的句柄-从而获取目标。
当使用CreateFileW()
和GetFinalPathNameByHandle()
查询远程链接时(\\?\UNC\....
),事情开始变得复杂。如果指定了FILE_FLAG_OPEN_REPARSE_POINT
,GetFinalPathNameByHandle()
总是返回链接路径,而非目标路径。如果未指定FILE_FLAG_OPEN_REPARSE_POINT
,则仅当目标存在且在与链接相同的计算机上时,才会返回目标路径。如果链接指向另一台计算机,我会收到网络权限错误。如果链接指向本地不存在的文件,则会出现文件未找到错误。