Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Files.walkFileTree时循环无限,且FOLLOW_链接处于打开状态_Java_File_Nio - Fatal编程技术网

Java 使用Files.walkFileTree时循环无限,且FOLLOW_链接处于打开状态

Java 使用Files.walkFileTree时循环无限,且FOLLOW_链接处于打开状态,java,file,nio,Java,File,Nio,通过使用方法Files.walkFileTree(Path,Set,int,FileVisitor)和FileVisitOption.FOLLOW\u链接打开。 我得到了一个无限循环的符号链接重定向到父目录。。java教程通过以下说明解释了如何检测导致问题的特定符号链接: 为文件调用visitFile方法。如果您指定了FOLLOW_LINKS选项,并且您的文件树具有指向 父目录,循环目录在 visitFileFailed方法带有FileSystemLoopException。以下 代码片段显示了

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

为文件调用visitFile方法。如果您指定了
FOLLOW_LINKS
选项,并且您的文件树具有指向 父目录,循环目录在
visitFileFailed
方法带有
FileSystemLoopException
。以下 代码片段显示了如何捕获循环链接,并且是从副本中获取的 例如:


它可以工作,它可以检测特定的文件。。然而,无休止的循环仍然存在。我如何继续只跳过创建问题的符号链接,以便浏览整个文件树而不陷入无休止的循环?

在上面的示例中,返回
FileVisitResult。继续
。表示此枚举中还有三个其他值:
SKIP_同胞
SKIP_子树
终止
。您可以尝试使用其中一种最适合您的方式。

在使用FOLLOW\u链接遍历文件树时,遇到一个符号链接,这将导致循环返回到祖先目录:

  • 链接既不调用preVisitDirectory也不调用postVisitDirectory
  • 将仅为链接调用visitFileFailed
  • 链接将不会被跟踪
正如您所看到的,文件树遍历器逻辑已经阻止了这种类型的无限递归,因此简单地记录错误消息并不一定是错误的


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

我可以将导致异常的文件名保存在一个静态列表中,然后在包含所有“循环”的静态列表中检查当前文件是否存在于fileVisit中符号链接..任何其他输入都非常受欢迎。在您的情况下是否调用了方法
visitFileFailed
?@nishantshresh是的,它确实被调用。但是,将文件名保存在静态列表中(在visitFileFailed中),然后签入fileVisit,如果当前文件包含在该静态列表中,则仅对System.exit有效(-1)但是如果我改为使用return FileVisitResult.CONTINUE;它将无限期地继续在visitFileFailed中唯一可用的枚举是CONTINUE;即使使用SKIP_子树也将被视为CONTINUE;SKIP_子树只有在preVisitDirectory中才有意义
@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;
}