【问题标题】:How do I programmatically access the target path of a windows symbolic link?如何以编程方式访问 Windows 符号链接的目标路径?
【发布时间】: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_POINTGetFinalPathNameByHandle() 总是返回链接路径,而不是目标路径。如果未指定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


【解决方案1】:

GetFinalPathNameByHandle

最终路径是 当路径完全返回时 解决。例如,对于一个符号 指向名为“C:\tmp\mydir”的链接 到“D:\yourdir”,最终文件系统 路径将是“D:\yourdir”。

【讨论】:

  • @Adam,不幸的是,虽然 GetFinalPathNameByHandle() 适用于本地符号链接,但它返回链接,而不是远程基于 UNC 的符号链接的目标。所以我“重新打开”了这个问题。
  • 我想我已按要求回答了问题(与您的 JNI/Mock 问题顺便说一句......咳咳)。也许这是一个新问题。
  • GetFinalPathNameByHandle 基本上是答案,如果只想使用本地链接。尽管就远程链接而言,该功能似乎存在错误。所以我再次将此标记为正确答案,并记录了警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2019-02-12
  • 2012-04-28
  • 2015-07-18
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多