2

我认为 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 注册表设置或什么?
4

3 回答 3

5

符号链接对使用底层文件系统的应用程序是透明的,例如,CreateFile() 和朋友,除非应用程序特别努力去了解它们。

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

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

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

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


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

于 2017-03-29T22:57:26.657 回答
2

它们对大多数应用程序应该是透明的,但有些应用程序是为了自己的利益而聪明的。

FILE_FLAG_OPEN_REPARSE_POINTCreateFile“验证”文件属性并阻塞FILE_ATTRIBUTE_REPARSE_POINT.

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

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

于 2017-03-29T10:41:03.980 回答
1

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

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

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

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

于 2017-03-29T10:44:50.533 回答