0

Files.walkFileTree(Path, Set<FileVisitOption>, int, FileVisitor)FileVisitOption.FOLLOW_LINKS をオンにしてメソッドを使用する。親ディレクトリにリダイレクトするシンボリック リンクで無限ループが発生します。この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 全体を探索するために、問題を引き起こしているシンボリック リンクのみをスキップするにはどうすればよいでしょうか?

4

2 に答える 2

0

FOLLOW_LINKS を使用してファイル ツリーをたどり、祖先ディレクトリへのループ バックを引き起こすシンボリック リンクが検出された場合:

  • リンクに対して preVisitDirectory も postVisitDirectory も呼び出されません。
  • リンクに対して呼び出されるのは visitFileFailed のみです。
  • リンクはたどられません

ご覧のとおり、ファイル ツリー ウォーカー ロジックは、このタイプの無限再帰を既に防止しているため、単にエラー メッセージをログに記録するだけでは、必ずしも問題はありません。

ただし、他の何かがプログラムで無限ループを引き起こしているに違いありません。ハード リンクを使用して、ファイル システムに循環参照を作成した可能性がありますか?

于 2016-11-07T10:14:47.790 に答える
0

上記の例では、 を返しFileVisitResult.CONTINUEます。javadocによると、この列挙には他に 3 つSKIP_SIBLINGSの値がSKIP_SUBTREEありTERMINATEます。あなたの状況に最適なものは何でも、それらの1つを使用しようとすることができます.

于 2013-08-13T12:07:14.047 に答える