2017-03-29 28 views
1

我认为Windows 10中的符号链接的行为与Linux符号链接类似,即它们对应用程序是透明的。但是,我对实际行为感到困惑。这些应用程序如何处理Windows符号链接?

举个例子,我都softlinked和硬链接相同的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 

soft and hard link

硬链接的行为可预测(从原始文件没有区别),但我不明白软链接的一个。例如,见这样的:

enter image description here

此外,当CSS被插入符编辑器所消耗的硬链接的样式表工作正常:

enter image description here

而softlinked被打破:

enter image description here

问题是:

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

应该注意的是,硬链接也不能可靠地工作,因为通常将保存实施为删除和重新创建(这打破了硬链接)而不是简单的写入。 –

+0

@HarryJohnston是啊,那也是我的想法。 Windows上的链接令人惊讶地很麻烦。 – Borek

回答

2

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

然而,它们透明到正在使用的外壳名字空间(例如,标准的打开文件对话框)的应用,因为壳对待符号链接,好像他们是快捷键,甚至在修改所显示的图标的点。无论这是否是对微软的一个明智的决定,在这个阶段是一个有争议的问题,因为它不会改变。据我所知,它是不可配置的。

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

因此,前两个示例(Explorer显示文件和Notepad ++行为的方式)是功能而不是bug;喜欢与否,这是Windows设计的工作方式。

您的最后一个例子在相关应用程序中看起来似乎是一个错误(或至多是不合需要的设计限制)。可能值得与供应商联系。


您还应该知道,创建符号链接需要管理权限,并且默认情况下它们不能在网络共享上运行。就个人而言,鉴于所有这些限制,我从来没有发现它们非常有用。对于大多数用户任务,我会使用快捷方式,而对于大多数系统管理任务来说,联结点更可靠。

+0

很好的答案,谢谢。应该注意的是,当创作者更新进入两周之后,管理权限将不再需要:) – Borek

+0

@Borek,有趣!虽然看起来只会是真的[如果机器处于开发者模式](https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/#YKZcKPd1JpFhCJ9b.97)开始用。希望在一两年后,如果这不会导致太多的安全问题,他们会进一步开放它。 –

1

他们应该是透明的大多数应用程序,但有些应用程序是巧妙的为自己好。

他们可能会通过FILE_FLAG_OPEN_REPARSE_POINTCreateFile,或者在“验证”文件属性并在FILE_ATTRIBUTE_REPARSE_POINT上扼杀时过于激进。

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

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

+0

Linux上是否存在类似的“问题”,或者这是Windows特有的?在实践中,它使得很难相信软链接,因为应用程序可能会中断,这取决于它们是如何编码的。 – Borek

+0

自2000年以来,硬链接和连接已经出现,符号链接在Vista中是新的,大多数人在Windows上不习惯它们,所以肯定会出现更多问题。 – Anders

+0

我认为Notepad ++正在以Windows用户期望的方式工作,通过报告文件的“真实”名称而不是链接的名称。无论如何,希望阻止改变它,因为[每次更改都会打断某人的工作流程](https://xkcd.com/1172/)。 :-) –

1

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

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

当你创建一个软链接时,你不是指向一个节点,而是指向一个文件。由于该软链接解决了它指向文件的路径。

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

相关问题