2013-03-05 68 views
2

這是問題所在。我有一個符號鏈接指向其他目錄:在一條路徑中解析符號鏈接和「..」

$ls -l /foo/bar 
lrwxrwxrwx /foo/bar -> /target/bar 

foo目錄下有一個文件x

$ls -l /foo 
lrwxrwxrwx me me 314 x 

現在,我想有以下路徑來x訪問/foo/bar/../x

$ls -l /foo/bar/../x : No such file or directory 

這在Bash中不起作用,但有沒有什麼辦法可以使它從Java使用File api?目錄結構可以是幾乎任意的,有可能會像/foo/bar/1/2/3/4/5/../../../../../../x案件等

在我尋找magic()方法檢查文件(假設前面提到的目錄結構)中存在的內容。換句話說:

magic("/foo/x") ... true 
magic("/foo/bar/../x") ... true 
magic("/foo/bar/1//../../x") ... true 
magic("/foo/bar/1/2/3/4/5/../../../../../../x") ... true 
magic("/foo/bar//1/../2/../../x") ... true 
magic("/foo/bar/1/2/../3/../../../x") ... true 
magic("/foo/bar/1/2/./../3/../4//../../../x") ... true 

magic("/foo/bar/x") ... false 
magic("/foo/bar/1/../x") ... false 
magic("/foo/bar/1/2/3/4/../../../../../../x") ... false 
magic("/foo/bar//1/../2/../x") ... false 

注1: getCanonicalPath()不爲我工作,因爲它首先解決了符號鏈接,然後所有的「..」「」在路徑中。反之亦然,我需要它。

注2:有可能我在路徑中的其他符號鏈接,它應該工作在相同的意義(目錄2可能是一個符號鏈接)。

注3:文件x僅位於/foo

到目前爲止,它看起來像我需要一個上下文無關語法的解析器,是不是有更容易解決這個問題的解決方案?

+1

這是Linux如何解析路徑的工件。這不是Bash或Java這樣做。 – 2013-03-05 20:50:18

+1

你想做什麼?如果你想做什麼是可能的,訪問文件系統路徑將是完全不明確的。 – Falmarri 2013-03-05 20:51:40

+0

@Falmarri:我只需要它:)使用整個圖片很難解釋它,這就是爲什麼我在這裏只提取問題的本質。 – 2013-03-05 20:53:47

回答

4

如果我理解正確,那麼Path.normalize()方法應該完全按照您的要求進行操作?

它消除..(除其他事項外),它的文件說

此方法不會訪問文件系統;該路徑可能找不到存在的文件。消除「..」和路徑中的前一個名稱可能會導致找到與原始路徑不同的文件的路徑。當前面的名稱是符號鏈接時可能會出現這種情況。

您不需要解析路徑上的其他符號鏈接,操作系統將在您嘗試最終訪問文件時解析它們。如果您想要解析符號鏈接,請事先調用Path.toRealPath()而不是,並將NOFOLLOW_LINKS作爲參數)。

+0

+1哇,所以我上面的評論是錯誤的;這樣的方法**不存在!在什麼情況下這會有用? – 2013-03-05 21:03:55

+0

@OliCharlesworth我不知道,但它似乎很常見。 Python有一個等效的函數('os.path.normpath()':http://docs.python.org/2/library/os.path.html#os.path.normpath)。 – 2013-03-05 21:06:58

+0

API設計者可能會添加這樣一種方法,因爲它比較容易,它不需要文件系統(所以沒有IOException異常並且沒有緩慢的磁盤訪問),並且它不依賴於平臺。 – 2013-03-05 21:08:47