在一个path中一起parsing符号链接和“..”

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

$ls -l /foo/bar lrwxrwxrwx /foo/bar -> /target/bar 

foo目录中有一个文件x

 $ls -l /foo lrwxrwxrwx me me 314 x 

现在,我想通过以下path/foo/bar/../x访问x

 $ls -l /foo/bar/../x : No such file or directory 

这在Bash中不起作用,但是有什么方法可以使用File api从Java进行工作吗? 目录结构可以是非常随意的,所以可能会有类似/foo/bar/1/2/3/4/5/../../../../../../x等的情况。

换句话说,我正在寻找magic()方法检查文件是否存在的内容(假设前面提到的目录结构):

 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 

注1: getCanonicalPath()不适用于我,因为它首先parsing符号链接,然后parsing所有“..”“。”。 在path中。 反之亦然,我需要它。

注2:在path中可能还有其他符号链接,它应该以同样的方式工作(方向2可能是符号链接)。

注3:文件x只位于/foo

到目前为止,它看起来像我需要一个parsing器的上下文无关语法,有没有更容易的解决这个问题?

如果我正确理解你, Path.normalize()方法应该做到你想要的?

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

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

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

Path是一个Java7 API。 如果你坚持使用Java6,我认为以下内容也适合这个账单: http : //commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/FilenameUtils的.html#正常化%28java.lang.String 29%