【问题标题】:What is the best way to convert an absolute path name to be used as sub-path?将绝对路径名转换为子路径的最佳方法是什么?
【发布时间】:2015-04-01 17:01:27
【问题描述】:

我正在使用 Java 编写一个备份程序,我想根据源的绝对路径名将文件和目录保存到备份目标。

备份程序应该在不同的操作系统(Unix、Windows、Mac OS X)下工作,所以我需要转换源文件和目录的绝对路径名。

所以最后我想将绝对源路径转换为目标的常规子路径。让我举几个例子。

Unix
绝对源路径:/home/thomas/data
目标路径:/backup
有效目的地:/backup/home/thomas/data

Windows
绝对源路径:c:\Documents and Settings\thomas
目标路径:e:\backup
有效目的地:e:\backup\c\Documents and Settings\thomas

我可以使用字符串替换操作,但我预计会遇到一些麻烦并开始一个永无止境的更正故事。

我认为 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)。

也许有人对我有一个想法或提示,或者知道一个已经在做我正在寻找的图书馆。

【问题讨论】:

  • 你有没有尝试过?
  • 嗯,可能我没看懂,但是你链接中的方法可以用来计算两条路径之间的“关系”。我喜欢的是基于绝对源路径和目标路径创建一个新的子路径。

标签: java absolute-path


【解决方案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);

【讨论】:

  • 是的,我使用的是 Java 7,并且确定我使用的是包“java.nio.file”中的 Path 和 Paths 类。但是你说的是哪种方法?
  • 非常感谢您的调查和详细解答。我用 docRoot \\server\c$\Windows, c:\Windows, U:\ 尝试了你的代码的一个小例子,但它失败了,最后一个出现异常。另请注意,我希望将根目录(如“server/c$”、“c:”或“u:”)保留在目标路径中。请参阅我的问题中的示例。
  • 为此,您可以在 docRoot 路径上使用 getRoot 并获取第一个字符,然后如果第一个字符是字母,则在备份路径中插入一个额外的目录(再次使用 resolve)。
猜你喜欢
  • 2014-01-28
  • 2017-08-01
  • 2011-11-07
  • 2011-05-02
相关资源
最近更新 更多