当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何以编程方式访问Windows符号链接的目标路径?》经验,为你挑选了1个好方法。

Windows 6(Vista和Server 2008)支持正确的符号链接,可以通过CreateSymbolicLink函数创建.但似乎没有相应的函数来询问符号链接以获得链接目标的路径.

我发现符号链接是重新分析点的实现,因此重新分析点函数可用于获取目标路径.但我需要使用重新分析点的头文件似乎与Windows驱动程序工具包一起提供.使用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未指定,则返回目标路径,但仅当目标存在且与链接位于同一台计算机上时才返回.如果链接指向另一台计算机,则会收到网络权限错误.如果链接指向本地 - 不存在 - 文件,我得到一个文件未找到错误.



1> Adam Mitz..:

GetFinalPathNameByHandle

最终路径是完全解析路径时返回的路径.例如,对于名为"C:\ tmp\mydir"的符号链接,指向"D:\ yourdir",最终的文件系统路径将为"D:\ yourdir".


大约四年前就​​解决了这个问题.如果你有更好的答案,请发表你自己的答案.然后,您可以解释上述答案中缺少的内容,而不是使用有限的评论空间来侮辱您的Stack Overflow社区成员.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有