在一个路径中一起解析符号链接和“..”

时间:2013-03-05 20:48:32

标签: java linux file file-io symlink

这是问题所在。我有一个指向其他目录的符号链接:

$ls -l /foo/bar
lrwxrwxrwx  /foo/bar  ->  /target/bar
<{1>}目录中的

有一个文件foo

x

现在,我希望通过以下路径访问$ls -l /foo lrwxrwxrwx me me 314 x x

/foo/bar/../x

这在Bash中不起作用,但有没有办法让它使用File api从Java工作?目录结构可能非常随意,因此可能会出现$ls -l /foo/bar/../x : No such file or directory 等情况。

换句话说,我正在寻找检查文件是否存在的/foo/bar/1/2/3/4/5/../../../../../../x方法的内容(假设前面提到的目录结构):

magic()

注1: getCanonicalPath()对我不起作用,因为它首先解析符号链接,然后解析所有“..”“。 “在路径中。我需要它反过来做。

注2:路径中可能还有其他符号链接,它应该在相同的意义上工作(dir magic("/foo/x") ... true magic("/foo/bar/../x") ... true magic("/foo/bar/1//../../x") ... true magic("/foo/bar/1/2/3/4/5/../../../../../../x") ... true magic("/foo/bar//1/../2/../../x") ... true magic("/foo/bar/1/2/../3/../../../x") ... true magic("/foo/bar/1/2/./../3/../4//../../../x") ... true magic("/foo/bar/x") ... false magic("/foo/bar/1/../x") ... false magic("/foo/bar/1/2/3/4/../../../../../../x") ... false magic("/foo/bar//1/../2/../x") ... false 可能是符号链接)。

注3:文件2位于x

到目前为止,看起来我需要一个无上下文语法的解析器,这个问题没有更简单的解决方案吗?

2 个答案:

答案 0 :(得分:4)

如果我理解正确,那么Path.normalize()方法应该完全符合您的要求吗?

它消除了..(除其他外),它的文档说

  

此方法不访问文件系统;路径可能找不到存在的文件。从路径中删除“..”和前一个名称可能会导致找到与原始路径不同的文件的路径。当前面的名称是符号链接时,可能会出现这种情况。

您无需解析路径上的其他符号链接,当您尝试最终访问该文件时,操作系统将解析它们。如果您想要解决符号链接,请稍后再调用Path.toRealPath()NOFOLLOW_LINKS作为参数)。

答案 1 :(得分:0)

Path是Java 7 API。如果你坚持使用Java 6,我认为以下内容也符合要求:http://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/FilenameUtils.html#normalize%28java.lang.String%29