用Java解析目录符号链接

mai*_*lin 7 java symlink

给定一个FilePath目录对象,如何检查它是否是符号链接,如何将其解析为实际目录?

我尝试过File.getCannonicalFile(),Files.isSymbolicLink(Path)还有许多其他方法,但它们似乎都没有用.一个有趣的事情是Files.isDirectory(Path)返回false,而Files.exists(Path)事实却是如此.java是否将符号链接视为文件而不是目录?

fge*_*fge 14

如果要完全解析a Path指向实际内容,请使用.toRealPath():

final Path realPath = path.toRealPath();
Run Code Online (Sandbox Code Playgroud)

这将解决所有符号链接等.

但是,由于这可能会失败(例如,符号链接无法解析),因此您必须在此处理IOException.

因此,如果要测试符号链接是否指向现有目录,则必须执行以下操作:

Files.isDirectory(path.toRealPath());
Run Code Online (Sandbox Code Playgroud)

请注意以下内容Files.exists():默认情况下,它遵循符号链接.

这意味着如果您有一个符号链接作为path其目标不存在,那么:

Files.exists(path)
Run Code Online (Sandbox Code Playgroud)

将返回FALSE; 但是这个:

Files.exists(path, LinkOption.NOFOLLOW_LINKS)
Run Code Online (Sandbox Code Playgroud)

将返回TRUE.

在"Unix的说法",这之间的区别stat()lstat().