2015-04-26 42 views
-2

我希望能夠將任何文件複製到我的程序的相對路徑。我如何進行路徑操作,以便它可以在任何操作系統/文件系統上運行?Java,將任何文件複製到新的根路徑

與Windows文件系統

c:\test.txt -> c:\myprogram\c\text.txt 
c:\temp\test.txt -> c:\myprogram\c\temp\text.txt 
d:\temp\test.txt -> c:\myprogram\d\temp\text.txt 

編輯一些例子:另一種方式問:我如何將任何文件到一個特定的文件夾,保持儘可能多的原始路徑成爲可能,並避免任何衝突。最難的部分是2個文件可以在Windows上使用不同的驅動器號具有相同的路徑。那麼其他文件系統呢?編輯2:一般來說,人們快速downvote。如果用戶已經注意了一點,他們會從示例中注意到,棘手的部分是根名。我想他們低估了,認爲這個問題很微不足道。刪除這個問題或者其他什麼,我不在乎。感謝fge給出了一個很好的答案。

+0

以跨文件系統的方式做它是不可能的;對於初學者來說,Windows和Unix文件系統不具有相同的根 – fge

+0

當然,這是可能的,但也許只能使用Path/File API。 – Stig

+0

我知道這可能並不容易,所以我發佈了這個問題。 – Stig

回答

-1

大多數時候你不需要做任何事情。 Java處理各種格式,當使用File.getPath時,它會返回系統分隔符的路徑。如果您確實需要知道操作系統的路徑分隔符,請使用File.separatorSystem.getProperty("path.separator")

例如,所有這些打印C:\JavaWork\Scala\Test\test.txt的:

System.out.println(new File("C:/JavaWork/Scala/Test/test.txt").getAbsolutePath()); 
System.out.println(new File("C:\\JavaWork\\Scala\\Test\\test.txt").getAbsolutePath()); 
System.out.println(new File("C://JavaWork//Scala//Test//test.txt").getAbsolutePath()); 
+0

「使用File.getPath時返回標準化路徑」< - 否則不會。一個'Path'的名字組件分隔符取決於從這個'Path'發出的'FileSystem'。在Windows文件系統上,這是一個反斜槓。 – fge

+0

@fge毫米權利,只是驗證。謝謝。 – Dici

+0

這不是關於文件分隔符的問題,它在api中很好地抽象出來。 – Stig

3

你不能這樣做,在一個可移植的方式。即使使用JSR 203

Path是兩個部分:

  • 根(可以是null);
  • 名稱組件的列表。

你有一個問題是與根。

對於Unix系統,例如,如果我們採取的路徑/foo/bar,您有:

  • 根:/;
  • 名稱組成:foobar

在Windows上,c:\foo\bar有部分:

  • 根:c:;
  • 名稱組成:foobar

這意味着爲了實現你想要的東西,你必須檢查根,並在將它變成名稱組件之前對其進行修剪。

因此,這將是一個小黑客...但這裏是一個可能性:然後

// Supposes that the original path has a root 
public static Path toNameComponents(final Path orig) 
{ 
    final Path root = orig.getRoot(); 
    final Path components = root.relativize(orig); 
    final Path mangledRoot = rootToComponents(root); 
    return mangledRoot.resolve(components); 
} 

和你rootToComponents()方法會產生cc:和Unix系統的空路徑。

之後,這是一個調用.resolve()的問題。現在


,就到了真正的原因,爲什麼你不能,最終使其在便攜方式:JSR 203並不要求絕對路徑有一個根......這恰好是Windows和Unix文件系統因爲它們是分層的。

+0

謝謝。當然,我希望這可以做得更好。手工操作非常危險,應在所有平臺上進行測試。 – Stig

+0

@Stig你總是可以限制自己的Windows和Unix;至於測試它,使用[memoryfilesystem](https://github.com/marschall/memoryfilesystem),它支持Windows路徑和Unix路徑。 – fge

相關問題