2

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

$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

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

4

2 回答 2

4

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

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

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

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

于 2013-03-05T21:01:49.627 回答
0

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

于 2013-06-12T13:41:37.870 回答