2013-04-01 23 views
1

的絕對路徑是相對比方說,我有絕對的「基地」路徑時,如何得到一個文件的絕對路徑:給出一個相對或絕對路徑和

/home/someone/dir1/dir2/ 

用戶可以通過我一個新的路徑,它們可以是絕對或相對基本路徑,所以下面都希望能有效:

.. 
/home/someone/dir1/ 

如何獲取Java給我即對於這兩種情況下,正確的絕對路徑:

/home/someone/dir1/ 

並以平臺無關的方式做到這一點?

我試過如下:

File resolvedFile = new File((new File(basePath).toURI().resolve(new File(newPath).toURI()))); 

然而,如果NEWPATH是相對的,NEWFILE(NEWPATH)自動解決它針對當前的工作目錄,而不是我想要提供的基本路徑。

有什麼想法? 非常感謝!

回答

1

回答我的問題..

好像它可以在Java 7中使用路徑來實現:

Path p1 = Paths.get("/home/joe/foo"); 
// Result is /home/joe/foo/bar 
System.out.format("%s%n", p1.resolve("bar")); 

既然不能獲得Java 7中的我的Mac 10.5.8,我正在用類似的東西(NB沒有經過徹底的測試!):

static String getAbsolutePath(String basePath, String relativeOrAbsolutePath) throws IOException {

boolean isAbsolute = false; 
    File relativeOrAbsoluteFile = new File(relativeOrAbsolutePath); 

    if (relativeOrAbsoluteFile.isAbsolute()){ 
     isAbsolute = true; 
    } 

    if (isAbsolute){ 
     return relativeOrAbsolutePath; 
    } 
    else { 
     File absoluteFile = new File(basePath, relativeOrAbsolutePath); 
     return absoluteFile.toString(); 
    } 

} 

+0

不起作用。忘了提及這需要在多線程環境中工作,所以設置系統屬性將無法正常工作..感謝您的答案,但.. – dns

0

看看File#getCanonicalPath

從JavaDoc中:

返回抽象路徑名的規範路徑名字符串。 A 規範路徑名既是絕對的也是唯一的。規範形式的精確定義 與系統有關。如果需要,此方法首先將此路徑名轉換爲絕對形式,就像調用 getAbsolutePath()方法一樣,然後將其映射到與系統相關的 方式的唯一形式。這通常涉及刪除諸如「。」之類的冗餘名稱 。和「..」,解析符號鏈接(在 UNIX平臺上),並將驅動器號轉換爲標準大小寫(位於 Microsoft Windows平臺)。

表示現有文件或目錄的每個路徑名都具有唯一的 規範形式。表示不存在的文件或 目錄的每個路徑名也具有唯一的規範形式。在創建文件或目錄 後,不存在的文件或目錄的路徑名的規範形式可能與相同路徑名的 規範形式不同。同樣,現有的 文件或目錄的路徑名的規範形式可能與刪除文件或目錄後相同的 路徑名的規範形式不同。

+0

不幸的是,它解決了針對當前工作目錄的相對路徑。我沒有看到提供相對路徑相對路徑的方式。 – Bruce

+0

相對路徑與您當前的位置相對。沒有額外的上下文,我不知道你如何能夠實現你想要的目標 – MadProgrammer

+0

額外的上下文是'基礎'路徑。它可以用java 7和Path完成,我認爲我的答案適用於java 6及更低版本。如果相對路徑中包含「../../」 java 1.6 – Bruce

0

試試這個在您的代碼。

System.setProperty( 「user.dir來」, 「your_base_path」)

+0

謝謝, – Bruce

0

不知道,如果這個工程我的設置(Windows平臺上,JRE 1.6.x版)

之外,但像下面工作特技:

File path = new File(relativeOrAbsoluteGoldpath); 
absolutePath = path.getCanonicalPath(); 

其中relativeOrAbsoluteGoldpath是可以是或可以不是相對於任意的路徑名。