3

ディレクトリで最後にアクセスしたファイルで何かをする必要があります。visitFile()自分への現在の通話が最後 の通話かどうかを知るにはどうすればよいですか?

(特定のディレクトリ内のすべてのファイルとディレクトリを一覧表示したいだけです。そのために、実装にdepthフィールドを導入し、深さが 0 より大きい場合はI return で返します。(そして、 をインクリメントします。)問題は、いつを 0にリセットするかわからないことです。別のディレクトリに対してこの FileVisitor 実装で を呼び出すと、はすでに > 0 であり、指定されたディレクトリのみがリストされます。)FileVisitorpreVisitDirectorySKIP_SUBTREEdepthdepthwalkFileTreedepth

4

1 に答える 1

4

との 2 つのメソッド内でのみ深さを維持するのはどうpreVisitDirectoryですかpostVisitDirectory? で増分depthpreVisitDirectory、 で減分しpostVisitDirectoryます。ただし、開始ディレクトリにある場合は、に初期化depthする-1必要がある場合があります。depth == 0そうすれば、常に権利を得ることができますdepth

編集: SKIP_SIBLINGSfromvisitFileではなくfrom から戻った場合でもpreVisitDirectorypostVisitDirectoryが呼び出されます!

コードサンプルは次のとおりです。

public class Java7FileVisitorExample {

public void traverseFolder(Path start){
    try {
        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {

            private int depth = -1;

            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                    throws IOException {
                System.out.println("preVisitDirectory(" + dir + ")");
                depth++;
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                    throws IOException {
                if (depth > 0) {
                    return FileVisitResult.SKIP_SIBLINGS;
                }

                System.out.println("visitFile(" + file + ", " + attrs + "): depth == " + depth);

                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException e)
                    throws IOException {
                if (e == null) {
                    depth--;
                    System.out.println("postVisitDirectory(" + dir + ")");
                    return FileVisitResult.CONTINUE;
                } else {
                    throw e;
                }


            }
        });
    } catch (IOException ex) {
        Logger.getAnonymousLogger().throwing(getClass().getName(), 
                "traverseFolder", ex);
    }
}

public static void main(String... args) {
    Path start = Paths.get("/Book/Algorithm");
    new Java7FileVisitorExample().traverseFolder(start);
}

}

于 2012-05-01T14:14:19.657 に答える