14

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未指定,则返回目标路径,但前提是目标存在并且与链接位于同一台机器上。如果链接指向另一台机器,我会收到网络权限错误。如果链接指向本地 - 不存在 - 文件,我会收到文件未找到错误。

4

1 回答 1

12

GetFinalPathNameByHandle

A final path is the path that is returned when a path is fully resolved. For example, for a symbolic link named "C:\tmp\mydir" that points to "D:\yourdir", the final filesystem path would be "D:\yourdir".

于 2008-10-21T11:36:14.983 回答