这是问题所在。我有一个指向其他目录的符号链接:
$ls -l /foo/bar
lrwxrwxrwx /foo/bar -> /target/bar
在foo
目录中有一个文件x
$ls -l /foo
lrwxrwxrwx me me 314 x
现在,我想x
通过以下路径访问/foo/bar/../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() 对我不起作用,因为它首先解析符号链接,然后解析所有 “..”或“.” 在路径中。我需要反之亦然。
注意 2:路径中可能还有其他符号链接,它应该在相同的意义上工作(dir2
可能是符号链接)。
注 3:该文件仅x
位于./foo
到目前为止,看起来我需要一个用于上下文无关语法的解析器,这个问题没有更简单的解决方案吗?