Files API获取文件夹的所有符号链接

时间:2018-05-17 23:12:20

标签: java file

Folder17
Folder18
Folder19 -> /myfolder/17
Folder20 -> /myfolder/17

我有一个从Folder19Folder17Folder 20Folder17的创建符号链接

我可以使用Files.isSymbolicLink(path)来查找文件是否符号链接。但还有另一种方法吗?我想知道链接到我的所有文件夹。就像在这种情况下,我想知道Folder17的所有链接应该给我Folder19Folder20

我在下面创建了类似下面的内容 cd / foo

mkdir b
ln -s /foo/b e
ln -s /foo/b f
ln -s /foo/b g
ls -la
    b
    e -> /foo/b
    f -> /foo/b
    g -> /foo/b

在我的java类中,我在下面做了。我期望返回尺寸为3的e,f,g。但是大小为0

    Path path = Paths.get("/foo/b");
    Collection<Path> paths      =  Files.walk(path)
            .filter(Files::isSymbolicLink)
            .filter(p -> {
                try {
                    return path.equals(Files.readSymbolicLink(p));
                } catch (IOException e) {
                    System.out.println("log");
                    throw new RuntimeException("An I/O error has occurred!");
                }
            })
            .collect(Collectors.toList());
    System.out.println(paths.size());
}
catch(Exception e)
{
    e.printStackTrace();
}

}

1 个答案:

答案 0 :(得分:2)

好问题。您可能会发现为什么某些文件A跟踪与A符号链接的每个文件会有多余,因为这可能会占用大量空间。因此,在目录中导航,检查文件A的符号链接会很简单。您可以使用类似于以下内容的内容:

Files.walk(path)
     .filter(Files::isSymbolicLink)
     .filter(p -> {
         try {
             return path.equals(Files.readSymbolicLink(p));
         } catch (IOException e) {
             throw new RuntimeException("An I/O error has occurred!");
         }
     })
     .collect(Collectors.toList());

这会返回一个List<Path>,其中包含Path的所有path个符号链接。

注意:如果需要,您可以使用Files#walkFileTree递归搜索这些目录。