如何保护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²) 时间来迭代文件系统。