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

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

好的,所以按照链接。

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

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

2

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

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

请参阅此处的API 。


 
  • 谢谢!但是如果我需要访问符号链接,这不会导致递归? —— 亚瑟 2016 年 7 月 12 日 12:38
  • @Arthur我认为那里不会或应该有基于Java的解决方案。这将需要 Java 进程提前检测符号链接是否是递归的并停止在那里爬行。 —— 梅纳 2016 年 7 月 12 日 12:41
1

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值