2012-10-09 14 views
3

我正在使用java 7的新Path對象,並且遇到問題。Paths之間的java.nio.Path相對化做假設,我無法檢查

我有一個基本目錄的文件存儲系統,我創建了我自己的相對路徑。最後,我想在某處存儲這條相對路徑。雖然我遇到了Path.relativize的問題。

我有兩個用例。 1.

Path baseDir = Paths.get("uploads"); 
Path filename = Paths.get("uploads/image/test.png") 

return baseDir.relativize(filename); 

該返回路徑image/test.png,這是完美的。

然而,用例2:

Path baseDir = Paths.get("uploads"); 
Path filename = Paths.get("image/test.png") 

return baseDir.relativize(filename); 

返回../image/test.png。我只是希望它返回到「圖像/ test.png」

Path tutorial它說

在沒有任何其他信息的,假定2條路徑是兄弟

我想要的是能夠檢測到這種情況。在這種情況下,我只想返回文件名並忽略baseDir。

我目前解決這個問題是這樣的,但我希望能有一個更好的辦法:

Path rootEnding = getRootDirectory().getName(getRootDirectory().getNameCount() - 1); 

for (Path part : path) { 
    if (part.equals(rootEnding)) { 
     return getRootDirectory().relativize(path); 
    } 
} 

return path; 

所以我的問題是,有沒有檢查這一點沒有更好的辦法?

回答

1

嘗試在relativize()之後加入normalize()。它似乎打算做到這一點(刪除不必要的..和。)。不要錯過關於javadoc中符號鏈接的警告。

+0

我測試了它,它沒有工作。如果不是第一部分,normalize()將只移除「../」。所以一行「example /../ image/test.png」就會變成「image/test.png」。但它不會對「../image/test.png」做任何事情,因爲這是一種有效的方式來達到直接而不是冗餘。 – Vincentz

+0

我應該仔細閱讀你的問題。我嘗試了一個不同的答案。 –

0

這不是100%等價於你上面寫的,但我認爲它是做你想做的。基本上,讓baseDir是一個相對路徑。假設不管baseDir是相對於文件系統的根目錄。然後允許filename與此「模擬根」相對或絕對。

什麼:

if (filename.startsWith(baseDir)) { 
    filename = baseDir.relativize(filename); 
} 
相關問題