2015-04-01 180 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

相关问题