我一直在四处寻找,试图找到一种方法来确定一个文件是否是一个联结,但没有找到任何令人满意的答案。
我尝试的第一件事是:
Files.isSymbolicLink(aPath)
它只检测符号链接(symbolic link),不检测 Windows 中称为连接的文件。
还尝试了此处提出的解决方案(使用 JNA 库): Stackoverflow question (3249117) ,但它从未在我知道是联结的任何文件上返回 true。
我发现确定哪些文件是联结的唯一方法是在 Windows 命令提示符下运行以下命令:
DIR /S /A:L
在我的电脑上它返回 66 个文件夹,而 Files.isSymbolicLink(aPath) 只返回 2 个。 所以我想我可以找到一种方法来利用它,但我认为它在遍历文件树时效率不是很高。
有没有办法使用标准 java 库或 JNA 来做到这一点?
最佳答案
如果你有正确的 java,比如 Oracle jdk 8,没有 JNA 也有办法做到这一点。它很狡猾,它可以停止工作,但是......
可以获取链接相关的BasicFileAttributes接口(interface):
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
有可能这个接口(interface)实现是一个类
sun.nio.fs.WindowsFileAttributes
。并且这个类有一个方法 isReparsePoint
,它对连接点和符号链接(symbolic link)都返回 true。所以你可以尝试使用反射并调用方法:
boolean isReparsePoint = false;
if (DosFileAttributes.class.isInstance(attr))
try {
Method m = attr.getClass().getDeclaredMethod("isReparsePoint");
m.setAccessible(true);
isReparsePoint = (boolean) m.invoke(attr);
} catch (Exception e) {
// just gave it a try
}
现在只能判断是否真的是符号链接(symbolic link):Files.isSymbolicLink(path)
如果不是,但它是重新分析点,那么就是交汇点。
关于java - 确定文件是否为联结(在 Windows 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733275/