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



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

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

如果不添加FileVisitOption.FOLLOW_LINKS,则爬网将不会遵循符号链接。

请参阅此处的 API。

好的

,所以点击链接。

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

但是,检查每个目录是否是符号链接:

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

Path realPath = path.toRealPath();

然后保持目录列表在,祖先,可以防止递归。通过对每个目录进行祖先检查,当符号链接位于列表/当前路径中的某个位置时。

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

(这仍然不能阻止两次访问目录,因为可以在没有递归的情况下链接相同的目录或子目录。

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

如果你需要一个比任意限制深度更健壮的方法,你可以实现一个FileVisitor当它遇到符号链接时,它会做一些检查,看看它是否是递归的,然后决定是否要遵循它。然后将访客与Files.walkFileTree一起使用。但是,这不会为您提供良好的路径流,因此您可能需要对代码进行一些调整。

至于检测递归的符号链接,我认为您可以使用File.getCanonicalPath和访问的规范路径的哈希图进行一些巫术。我手边没有 linux 机器,所以我还没有测试过这个,YMMV。

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

最新更新