java - 确定文件是否为联结(在 Windows 中)?

标签 java windows winapi jna

我一直在四处寻找,试图找到一种方法来确定一个文件是否是一个联结,但没有找到任何令人满意的答案。

我尝试的第一件事是:

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/

相关文章:

java - Java中的文件截断操作

java - 使用 JNA 从 Windows 访问工具提示

java - 从 Activity 的 onCreate 中已运行的服务获取数据

c++ - WinAPI 的 Groupbox 字体问题

c - ReadFileEx/WriteFileEx是否不需要lpCompletionRoutine和使用GetOverlappedResult?

Java:读取带有分隔符的文件时出错

windows - 当标签位于内部时,for 命令仅对第一个值执行

linux - 如何使用shell脚本将文件从windows复制到linux?

database - oracle 11g odbc drivers installation on windows 7 oracle odbc driver 同名已存在

c# - WPF 控件中的 native Win32 窗口