【发布时间】:2010-09-18 07:07:15
【问题描述】:
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 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,则返回目标路径,但前提是目标存在并且与链接位于同一台机器上。如果链接指向另一台机器,我会收到网络权限错误。如果链接指向本地不存在的文件,我会收到文件未找到错误。
【问题讨论】:
-
请说明符号链接本身是在远程服务器上(通过 UNC)还是符号链接目标是 UNC 路径。
-
另外,我认为您不需要 DDK 来读取重解析点(没有“解析点”之类的东西)。请参阅 CreateFile 上的 FILE_FLAG_OPEN_REPARSE_POINT 标志或 DeviceIoControl 的 FSCTL_GET_REPARSE_POINT 标志。这些是否有帮助取决于您对我之前评论的回答。
-
Explorer 以某种方式做到了,我怀疑它是直接通过发送 IO_CTL 的。试试看:创建一个目录符号链接,为其设置属性,然后您将获得一个带有灰色目的地的“快捷方式”选项卡。
标签: windows visual-studio-2008 symlink