簡體   English   中英

在上使用FOLLOW_LINK的Files.walkFileTree時出現無限循環

[英]Endless loop while using Files.walkFileTree with FOLLOW_LINK on

通過在FileVisitOption.FOLLOW_LINKS上使用方法Files.walkFileTree(Path, Set<FileVisitOption>, int, FileVisitor) 我得到了一個無限循環,其中的符號鏈接重定向到父目錄。. Java教程通過以下說明說明了如何檢測導致該問題的特定符號鏈接的方法:

對文件調用visitFile方法。 如果您指定了FOLLOW_LINKS選項,並且文件樹具有到父目錄的循環鏈接,則在visitFileFailed方法中使用FileSystemLoopException報告循環目錄。 以下代碼段顯示了如何捕獲循環鏈接,該代碼段來自“復制”示例:

@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而不會陷入無休止的循環?

在上面的示例中,您返回FileVisitResult.CONTINUE Javadoc表示此枚舉中還有其他三個值: SKIP_SIBLINGSSKIP_SUBTREETERMINATE 您可以嘗試使用其中一種最適合您的情況。

當使用FOLLOW_LINKS遍歷文件樹並遇到符號鏈接時,這將導致循環返回到祖先目錄:

  • 鏈接不會調用preVisitDirectory或postVisitDirectory
  • 鏈接只會調用visitFileFailed
  • 該鏈接將不被關注

如您所見,文件樹瀏覽器邏輯已經可以防止這種類型的無限遞歸,因此簡單地記錄一條錯誤消息並不一定意味着什么。

但是,某些其他原因必須導致程序中的無限循環。 也許您已經使用硬鏈接在文件系統中創建了循環引用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM