2017-03-29 29 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的路徑。

相關問題