0

通过使用Files.walkFileTree(Path, Set<FileVisitOption>, int, FileVisitor)启用 FileVisitOption.FOLLOW_LINKS 的方法。我得到一个无限循环,符号链接重定向到父目录。这个java教程解释了一种如何检测导致问题的特定符号链接的方法,说明如下:

为文件调用 visitFile 方法。如果您已指定该FOLLOW_LINKS选项并且您的文件树具有到父目录的循环链接,则循环目录将在 visitFileFailed方法中报告为FileSystemLoopException. 以下代码片段显示了如何捕获循环链接,来自 Copy 示例:

@Override
public FileVisitResult
    visitFileFailed(Path file,
        IOException exc) {
    if (exc instanceof FileSystemLoopException) {
        System.err.println("cycle detected: " + file);
    } else {
        System.err.format("Unable to copy:" + " %s: %s%n", file, exc);
    }
    return CONTINUE;
}

它有效,它检测到特定文件..但是无限循环仍然存在。我怎样才能继续跳过创建问题的符号链接,以便探索整个 FileTree 而不会陷入无限循环?

4

2 回答 2

0

在上面的示例中,您返回FileVisitResult.CONTINUE. javadoc说这个枚举中还有其他三个值SKIP_SIBLINGSSKIP_SUBTREETERMINATE。您可以尝试使用其中一种最适合您的情况。

于 2013-08-13T12:07:14.047 回答
0

当使用 FOLLOW_LINKS 遍历文件树并遇到符号链接时,这将导致循环回到祖先目录:

  • 不会为链接调用 preVisitDirectory 或 postVisitDirectory
  • 只会为链接调用 visitFileFailed
  • 该链接将不会被关注

如您所见,文件树遍历器逻辑已经阻止了这种类型的无限递归,因此简单地记录错误消息并没有什么错。

但是,一定是其他原因导致程序中的无限循环。也许您已经使用硬链接在文件系统中创建了循环引用?

于 2016-11-07T10:14:47.790 回答