2015-04-01 259 views
0

我在寫一個使用Java的備份程序,我想根據源的絕對路徑名將文件和目錄保存到備份目標。將絕對路徑名轉換爲子路徑的最佳方法是什麼?

備份程序應該在不同的操作系統(Unix,Windows,Mac OS X)下工作,所以我需要轉換源文件和目錄的絕對路徑名。

所以最後我想將絕對源路徑轉換爲目標的常規子路徑。讓我舉一些例子。

的Unix
絕對源路徑:/家庭/托馬斯/數據
目標路徑:/備份
有效目的地:/備份/家庭/托馬斯/數據

Windows
絕對源路徑:c:\ Documents and Settings \ thomas
目標路徑:E:\備份
有效目的地:E:\備份\ C \ Documents和Settings \托馬斯

我可以使用字符串替換操作,但我希望能碰上幾個麻煩,開始一個永無止境的矯正故事。

我認爲Windows環境需要特殊的處理,因爲主要的驅動器號。在* nix下,我可以簡單地連接兩條路徑。另請注意,源路徑可能是Windows下的UNC路徑,如\\ share \ data。

我周圍搜索,發現了幾個類似的問題,但沒有人回答我的問題(例如Is there a Java utility which will convert a String path to use the correct File separator char?Convert Windows-style path into Unix path)。

也許任何人對我有一個想法或暗示,或者知道一個圖書館已經做我正在尋找的東西。

+0

你嘗試過什麼嗎? – 2015-04-01 17:10:07

+1

查看https://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#relativize%28java.nio.file.Path%29 – dhke 2015-04-01 17:14:38

+0

嗯,也許我不明白,但鏈接中的方法可用於計算兩條路徑之間的「關係」。我喜歡的是根據絕對源路徑和目標路徑創建新的子路徑。 – Thorsten 2015-04-01 18:07:06

回答

1

如果您使用的是Java 7或更高版本,則Paths類及其方法可能有用。好的概述在這裏:https://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

特別爲您的使用情況,您需要subpath(獲取部分路徑)和resolve(結合兩條路徑)。我會嘗試這樣的事情:

Path backupRoot = Paths.get("/backup"); 
Path docRoot = Paths.get("/home/user1/docs"); 
// This line gets the full doc path without the root 
Path docs = docRoot.subpath(0, docRoot.getNameCount()); 
// This line creates the path "/backup/home/user1/docs" 
Path backupDocs = backupRoot.resolve(docs); 
+0

是的,我正在使用Java 7,並且確定我正在使用包「java.nio.file」中的Path和Paths類。但是你在談論哪種方法? – Thorsten 2015-04-01 18:11:30

+0

我用一些示例代碼修改了我的答案。 – eggheadmike 2015-04-02 13:28:58

+0

非常感謝您的調查和您的詳細解答。我用docRoot \\ server \ c $ \ Windows,c:\ Windows,U:\試了一個代碼的小例子,它在最後一個例外時失敗了。另外請注意,我想保留根目錄「server/c $」,「c:」或「u:」在我的目標路徑中可見。在我的問題中看到我的例子。 – Thorsten 2015-04-03 11:14:39

相關問題