2016-12-05 175 views
1

我創建了一個包含文件列表的符號鏈接文件夾。有沒有辦法將符號鏈接轉換爲使用java的HardLink?隱藏符號鏈接文件夾到硬鏈接文件夾

+2

你爲什麼要這樣做?硬鏈接很少是一個好主意。 –

+0

您是否閱讀過https://docs.oracle.com/javase/tutorial/essential/io/links.html? – 2016-12-05 07:43:50

+0

@Eli sadoff要求就是這樣。三個文件夾source-temp-destination。源到他們需要使用符號鏈接的溫度。一旦最終修改完成。他們需要將臨時文件夾中的文件移動到目標位置並刪除臨時文件夾。 –

回答

0

若要用java硬鏈接,你可以使用:

Path newLink = ...; 
Path existingFile = ...; 
try { 
    Files.createLink(newLink, existingFile); 
} catch (IOException x) { 
    System.err.println(x); 
} catch (UnsupportedOperationException x) { 
    // Some file systems do not 
    // support adding an existing 
    // file to a directory. 
    System.err.println(x); 
} 

所以,你的情況newLink應該是你創建的oldSymbolicLinkexistingFile表示其目標。

獲取符號鏈接的目標,你可以使用

Files.readSymbolicLink(oldSymbolicLink)); 

甲骨文文件:Links, Symbolic or Otherwise

+0

如果我們從符號鏈接文件夾創建硬鏈接,它將無法正常工作,對吧? –

0

Java doc由別人指出說,在目錄硬鏈接不能創建。所以,我不會告訴你如何創建目錄的硬鏈接,而是要解釋爲什麼你不能在目錄上創建硬鏈接。

當您嘗試遍歷目錄樹時,硬鏈接在目錄上會導致循環。

例如,如果你有一個目錄/foo/bar和符號鏈接/foo/bar/baz指向../bar,當您嘗試遍歷這棵樹,你會遇到一個無限循環。現在

/foo/ 
/foo/bar 
/foo/bar/baz 
/foo/bar/baz/bar 
/foo/bar/baz/bar/baz 
... 

,如果baz是一個符號鏈接../bar,它是簡單的使用unlink(2)系統調用(因爲取消鏈接不跟隨符號連接)斷開鏈接baz修復。但是,如果baz是一個硬鏈接,那麼這將是很多harder(沒有雙關語意圖)來解決這個問題。在「Unix環境下的高級編程」一書中,Stephen Rago指出Rich Stevens在嘗試這個實驗時損壞了他的文件系統(並且fsck無法恢復)