2

メソッドを使用する場合

java.nio.file.Files.walkFileTree(パス ルート、設定オプション、int maxDepth、FileVisitor ビジター)

アクセスするファイルの最大深度を指定できます。特定の正確な深さのパスのみを訪問するように指定する方法はありますか?

より具体的には、ディレクトリにアクセスしたいだけですが、これは簡単に確認できます

if (attrs.isDirectory()) {
    // do something
}

コールバックでvisitFile


例: ファイルroot/dir1/dir11/file.aとを含むディレクトリ構造がありroot/dir2/file.b、 で呼び出すwalkFileTreerootmaxDepth=2ます。次に、処理したいだけです

root/dir1/dir11

root/dir2/file.b深さが 2 の file も、深さが 2 未満の他のディレクトリ パスも処理したくありません。

root
root/dir1
root/dir2
4

1 に答える 1

3

興味深いことに、単純な実装はまさに私が望むことを行います:

Files.walkFileTree(root, EnumSet.noneOf(FileVisitOption.class), 2, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
        if (attrs.isDirectory()) {
            process(path);
        }
        return FileVisitResult.CONTINUE;
    }
});

つまり、この例では、正確に のみを処理しますroot/dir1/dir11

このソリューションは、明らかに矛盾するアプローチを利用して、 visit Files内のディレクトリをフィルタリングします。ただし、の JavaDoc は、これが望ましい動作になる理由を説明しています。walkFileTree

検出されたファイルごとに、このメソッドはその java.nio.file.attribute.BasicFileAttributes の読み取りを試みます。ファイルがディレクトリでない場合は、visitFile メソッドがファイル属性で呼び出されます。(...)

maxDepth パラメータは、アクセスするディレクトリの最大レベル数です。(...)ディレクトリを含むすべてのファイルに対して、visitFile メソッドが呼び出され、maxDepth で検出されます (...)

于 2015-06-24T12:16:02.660 に答える