应用程序如何处理 Windows 符号链接?
How are Windows symbolic links treated by the apps?
我认为 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 时,硬链接样式表工作正常:
当软链接被破坏时:
问题是:
- 符号链接在 Windows 上的实际行为如何?
- 软链接可以对应用透明吗?通过透明,我的意思是应用程序将始终将文件视为位于符号链接路径 (
...\symlinked.css
) 上,并且永远不会解析为原始路径 (...\Default.css
)。是否有一些 Windows 注册表设置之类的?
它们对大多数应用程序应该是透明的,但有些应用程序为了自己的利益而变得聪明。
他们可能会将 FILE_FLAG_OPEN_REPARSE_POINT
传递给 CreateFile
,或者在 "verifying" 文件属性时过于激进并阻塞 FILE_ATTRIBUTE_REPARSE_POINT
。
在你的具体情况下,我猜高级编辑器应该在他们打开的对话框中使用 FOS_NODEREFERENCELINKS
。 CSS 切换器可能正在使用 FILE_FLAG_OPEN_REPARSE_POINT
,您应该能够使用 Process monitor.
进行验证
没有可以使用的神奇注册表项,您必须联系应用程序作者。
文件是指向某个节点的指针。
当您创建硬 link 时,您只是在创建一个指向与原始文件相同的节点的新文件。
当您创建软文件时 link 您不是在创建指向节点的指针,而是指向文件的指针。因为软 link 解析了它指向的文件的路径。
由于 symlink 包含它自己的路径和它指向的路径,因此它实际上取决于应用程序开发人员选择他们想要在 UI.
中放置的路径
符号链接对于使用底层文件系统的应用程序是透明的,例如 CreateFile() 和朋友,除非应用程序做出特定的努力来了解它们。
但是,它们不对使用shell命名空间的应用程序透明(例如标准的“打开文件”对话框),因为shell处理符号链接就好像它们是快捷方式一样,甚至可以修改显示的图标。这是否是微软方面的明智决定在现阶段尚无定论,因为它不会改变。据我所知,它是不可配置的。
在实践中,这通常意味着符号链接对于非 GUI 应用程序和 GUI 应用程序中的内部文件(DLL、内置模板、配置文件等)将表现透明,但对于用户文档则不然。
因此您的前两个示例(资源管理器显示文件的方式和 Notepad++ 的行为)是功能而不是错误;不管喜欢与否,这就是 Windows 设计的工作方式。
您的最后一个示例在所讨论的应用程序中确实是一个错误(或者充其量是一个不受欢迎的设计限制)。可能值得联系供应商。
您还应该知道,创建符号链接需要管理权限,默认情况下它们根本无法通过网络共享工作。就个人而言,鉴于所有这些限制,我从未发现它们非常有用。对于大多数用户任务,我会改用快捷方式,对于大多数系统管理任务,连接点更可靠。
我认为 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 时,硬链接样式表工作正常:
当软链接被破坏时:
问题是:
- 符号链接在 Windows 上的实际行为如何?
- 软链接可以对应用透明吗?通过透明,我的意思是应用程序将始终将文件视为位于符号链接路径 (
...\symlinked.css
) 上,并且永远不会解析为原始路径 (...\Default.css
)。是否有一些 Windows 注册表设置之类的?
它们对大多数应用程序应该是透明的,但有些应用程序为了自己的利益而变得聪明。
他们可能会将 FILE_FLAG_OPEN_REPARSE_POINT
传递给 CreateFile
,或者在 "verifying" 文件属性时过于激进并阻塞 FILE_ATTRIBUTE_REPARSE_POINT
。
在你的具体情况下,我猜高级编辑器应该在他们打开的对话框中使用 FOS_NODEREFERENCELINKS
。 CSS 切换器可能正在使用 FILE_FLAG_OPEN_REPARSE_POINT
,您应该能够使用 Process monitor.
没有可以使用的神奇注册表项,您必须联系应用程序作者。
文件是指向某个节点的指针。
当您创建硬 link 时,您只是在创建一个指向与原始文件相同的节点的新文件。
当您创建软文件时 link 您不是在创建指向节点的指针,而是指向文件的指针。因为软 link 解析了它指向的文件的路径。
由于 symlink 包含它自己的路径和它指向的路径,因此它实际上取决于应用程序开发人员选择他们想要在 UI.
中放置的路径符号链接对于使用底层文件系统的应用程序是透明的,例如 CreateFile() 和朋友,除非应用程序做出特定的努力来了解它们。
但是,它们不对使用shell命名空间的应用程序透明(例如标准的“打开文件”对话框),因为shell处理符号链接就好像它们是快捷方式一样,甚至可以修改显示的图标。这是否是微软方面的明智决定在现阶段尚无定论,因为它不会改变。据我所知,它是不可配置的。
在实践中,这通常意味着符号链接对于非 GUI 应用程序和 GUI 应用程序中的内部文件(DLL、内置模板、配置文件等)将表现透明,但对于用户文档则不然。
因此您的前两个示例(资源管理器显示文件的方式和 Notepad++ 的行为)是功能而不是错误;不管喜欢与否,这就是 Windows 设计的工作方式。
您的最后一个示例在所讨论的应用程序中确实是一个错误(或者充其量是一个不受欢迎的设计限制)。可能值得联系供应商。
您还应该知道,创建符号链接需要管理权限,默认情况下它们根本无法通过网络共享工作。就个人而言,鉴于所有这些限制,我从未发现它们非常有用。对于大多数用户任务,我会改用快捷方式,对于大多数系统管理任务,连接点更可靠。