这是问题所在。我有一个指向其他目录的符号链接:
$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
。
到目前为止,看起来我需要一个无上下文语法的解析器,这个问题没有更简单的解决方案吗?
答案 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