/target/bar 在 foo 目录中-6ren">
gpt4 book ai didi

java - 在一个路径中一起解析符号链接(symbolic link)和 ".."

转载 作者:太空狗 更新时间:2023-10-29 11:46:00 25 4
gpt4 key购买 nike

问题来了。我有一个指向其他目录的符号链接(symbolic link):

$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 让它在 Java 中起作用吗?接口(interface)?目录结构可以是任意的,所以可能有像 /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() 对我不起作用,因为它首先解析符号链接(symbolic link),然后解析所有 "..""。 " 在路径中。我需要反之亦然。

注意 2:路径中可能还有其他符号链接(symbolic link),它应该以相同的方式工作(dir 2 可能是一个符号链接(symbolic link))。

注意 3:文件 x 位于 /foo 中。

到目前为止,我似乎需要一个上下文无关语法的解析器,是否有更简单的解决方案来解决这个问题?

最佳答案

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

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

This method does not access the file system; the path may not locate a file that exists. Eliminating ".." and a preceding name from a path may result in the path that locates a different file than the original path. This can arise when the preceding name is a symbolic link.

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

关于java - 在一个路径中一起解析符号链接(symbolic link)和 "..",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com