如何保护 Files.walk 免受符号链接递归的影响?

How to protect Files.walk from symbolic links recursion?

如何保护 Files.walk 免受符号链接递归的影响? 使用 Java 或 shell.

您可以使用 FileVisitOption 参数化 Files.walk 调用。

如果不加FileVisitOption.FOLLOW_LINKS,抓取将不会跟随符号链接。

参见 API here

好的,所以请关注 links。

Stream<Path> stream = walk(startPath, maxDepth, FileVisitOption.FOLLOW_LINKS);

但是检查每个目录是否是符号 link:

Files.isSymbolicLink(path) && Fles.isDirectory(path)

使用

Path realPath = path.toRealPath();

那么保留一个目录列表就可以了,祖先们,这样可以防止递归。通过为 每个 目录检查祖先,当符号 link 位于 list/current 路径中时。

a > b > START:c > d > e > SYMBOLIC:f=a > b > c

(这仍然不能阻止访问一个目录两次,因为可以在不递归的情况下 link 编辑同一个目录或子目录。)

Files.walk 似乎不受符号 link 递归的保护。您可以通过将 maxDepth 设置为合理的值来限制搜索深度,例如 i.d.k。 200左右?

如果您需要比任意限制深度更强大的方法,您可以实施 FileVisitor which when it encounters a symbolic link does some checking to see if it is recursive and then decide if you want to follow it or not. Then use the visitor with Files.walkFileTree。但是,这不会为您提供良好的路径流,因此您可能必须对代码进行一些调整。

至于检测递归的符号 link,我认为您可以使用 File.getCanonicalPath 和已访问规范路径的散列映射来施展魔法。我手边没有 linux 机器,所以我还没有测试过,YMMV。

无论您做什么,都不要像其他答案所建议的那样使用 List 访问路径,因为这会给您 O(n²) 时间来遍历文件系统。