解析 Java 中的目录符号链接
Resolving Directory Symlink in Java
给定一个 File
或 Path
目录对象,如何检查它是否是符号链接以及如何将其解析为实际目录?
我试过 File.getCannonicalFile()
、Files.isSymbolicLink(Path)
和许多其他方法,但其中 none 似乎有效。一件有趣的事情是 Files.isDirectory(Path)
returns 为假,而 Files.exists(Path)
为真。 java 是否将符号链接视为文件而不是目录?
如果要完全解析一个Path
指向实际内容,使用.toRealPath()
:
final Path realPath = path.toRealPath();
这将解析所有符号 links 等
但是,由于这可能会失败(例如,symlink 无法解析),您必须在此处处理 IOException
。
因此,如果你想测试一个 symlink 是否指向一个 existing 目录,你必须这样做:
Files.isDirectory(path.toRealPath());
注意 Files.exists()
的一个微妙之处:默认情况下,它遵循符号 links。
这意味着如果你有一个符号 link 作为一个 path
其目标不存在,那么:
Files.exists(path)
将 return 假;但是这个:
Files.exists(path, LinkOption.NOFOLLOW_LINKS)
将 return 为真。
在"Unix parlance"中,这是stat()
和lstat()
的区别。
给定一个 File
或 Path
目录对象,如何检查它是否是符号链接以及如何将其解析为实际目录?
我试过 File.getCannonicalFile()
、Files.isSymbolicLink(Path)
和许多其他方法,但其中 none 似乎有效。一件有趣的事情是 Files.isDirectory(Path)
returns 为假,而 Files.exists(Path)
为真。 java 是否将符号链接视为文件而不是目录?
如果要完全解析一个Path
指向实际内容,使用.toRealPath()
:
final Path realPath = path.toRealPath();
这将解析所有符号 links 等
但是,由于这可能会失败(例如,symlink 无法解析),您必须在此处处理 IOException
。
因此,如果你想测试一个 symlink 是否指向一个 existing 目录,你必须这样做:
Files.isDirectory(path.toRealPath());
注意 Files.exists()
的一个微妙之处:默认情况下,它遵循符号 links。
这意味着如果你有一个符号 link 作为一个 path
其目标不存在,那么:
Files.exists(path)
将 return 假;但是这个:
Files.exists(path, LinkOption.NOFOLLOW_LINKS)
将 return 为真。
在"Unix parlance"中,这是stat()
和lstat()
的区别。