【问题标题】:How are Windows symbolic links treated by the apps?应用程序如何处理 Windows 符号链接?
【发布时间】:2017-08-22 18:27:33
【问题描述】:

我认为 Windows 10 中的符号链接的行为类似于 Linux 符号链接,即它们对应用程序是透明的。但是,我对实际行为感到困惑。

例如,我对同一个 CSS 文件进行了软链接和硬链接:

$ mklink softlinked.css Default.css
symbolic link created for softlinked.css <<===>> Default.css

$ mklink /H hardlinked.css Default.css
Hardlink created for hardlinked.css <<===>> Default.css

硬链接的行为可预测(与原始文件无法区分),但我不理解软链接的行为。例如看这个:

此外,当插入符号编辑器使用 CSS 时,硬链接样式表可以正常工作:

当软链接被破坏时:

问题是:

  1. 符号链接在 Windows 上的实际表现如何?
  2. 能否使软链接对应用程序透明?通过透明,我的意思是应用程序将始终将文件视为符号链接路径 (...\symlinked.css) 并且永远不会解析为原始路径 (...\Default.css)。是否有一些 Windows 注册表设置或什么?

【问题讨论】:

  • 可能应该注意到硬链接也不能可靠地工作,因为通常将保存实现为删除和重新创建(这会破坏硬链接)而不是简单的写。
  • @HarryJohnston 是的,我也是这么想的。链接在 Windows 上非常麻烦。

标签: windows symlink mklink


【解决方案1】:

符号链接对使用底层文件系统的应用程序是透明的,例如 CreateFile() 和友元,除非应用程序特别注意它们。

然而,它们对使用 shell 命名空间的应用程序(例如标准的打开文件对话框)是透明的,因为 shell 将符号链接视为快捷方式,甚至到了修改的地步显示的图标。对于微软而言,这是否是一个明智的决定在现阶段尚无定论,因为它不会改变。据我所知,它是不可配置的。

实际上,这通常意味着符号链接对于非 GUI 应用程序和 GUI 应用程序中的内部文件(DLL、内置模板、配置文件等)是透明的,但对于用户的文档则不是。

因此,您的前两个示例(资源管理器显示文件的方式和 Notepad++ 的行为)是功能而不是错误;不管你喜不喜欢,这就是 Windows 设计的工作方式。

您的最后一个示例确实似乎是相关应用程序中的错误(或充其量是不受欢迎的设计限制)。可能值得联系供应商。


您还应该知道,创建符号链接需要管理权限,并且默认情况下它们根本无法通过网络共享工作。就个人而言,鉴于所有这些限制,我从未发现它们非常有用。对于大多数用户任务,我会改用快捷方式,而对于大多数系统管理任务,连接点更可靠。

【讨论】:

  • 很好的答案,谢谢。应该注意的是,当创作者更新在两周后到来时,将不再需要管理权限:)
  • @Borek,很有趣!虽然看起来这只会是真的if the machine is in Developer mode 开始。希望一两年后,如果这不会导致太多安全问题,他们会进一步开放。
  • 我之前在网络上使用过符号文件链接,它们运行良好。例如,我有一个要在多台计算机之间共享的应用程序的配置文本文件。我将文件放在文件共享上,然后在需要使用它的每台计算机上创建了指向该文件的链接。
  • @Jack,是的,这是本地到远程,默认情况下启用。本地到本地也是如此。但是远程到本地(网络共享上的符号链接指向本地路径)和远程到远程(网络共享上的符号链接指向网络路径)在默认配置中都被禁用。
【解决方案2】:

它们对大多数应用程序应该是透明的,但有些应用程序需要聪明才智。

他们可能会将FILE_FLAG_OPEN_REPARSE_POINT 传递给CreateFile,或者在“验证”文件属性时过于激进并阻塞FILE_ATTRIBUTE_REPARSE_POINT

在您的具体情况下,我猜高级编辑器应该在其打开的对话框中使用FOS_NODEREFERENCELINKS。 CSS 切换器可能正在使用FILE_FLAG_OPEN_REPARSE_POINT,您应该能够使用Process monitor 进行验证。

没有可以使用的神奇注册表项,您必须联系应用程序作者。

【讨论】:

  • Linux 上是否存在类似的“问题”,或者这是特定于 Windows 的?在实践中,很难信任软链接,因为应用程序可能会中断,具体取决于它们的编码方式。
  • 硬链接和连接自 2000 年以来就已经存在,符号链接在 Vista 中是新的,大多数人在 Windows 上不习惯它们,因此肯定会出现更多问题。
  • 我认为 Notepad++ 的工作方式符合 Windows 用户的预期,它报告文件的“真实”名称而不是链接名称。无论如何,期待改变它的阻力,因为every change breaks someone's workflow。 :-)
  • @HarryJohnston 没有?我希望 Windows 取消引用 .lnk 文件并通过目标路径打开目标文件,但对于符号链接,我希望它打开目标文件流但使用符号链接路径。在十六进制编辑器等中。我希望它也能打开原始 .lnk 文件。
  • @HarryJohnston 您可以告诉对话框不要取消引用任何内容,然后根据所选文件进行决定。对于目录符号链接,您希望它更改整个上游路径还是在大多数情况下透明地充当普通文件夹?我只是希望应用程序在我选择的文件上调用 CreateFile,无论 FS 级别发生的任何技巧对应用程序来说都不重要。
【解决方案3】:

文件是指向某个节点的指针。

当您创建硬链接时,您只是在创建一个指向与原始文件相同节点的新文件。

当您创建软链接时,您不是在创建指向节点的指针,而是指向文件。因为该软链接解析了它指向的文件的路径。

由于符号链接既包含它自己的路径,也包含它指向它的路径,因此实际上取决于应用程序开发人员选择他们想要放入 UI 中的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2014-04-14
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多