との 2 つのメソッド内でのみ深さを維持するのはどうpreVisitDirectory
ですかpostVisitDirectory
? で増分depth
しpreVisitDirectory
、 で減分しpostVisitDirectory
ます。ただし、開始ディレクトリにある場合は、に初期化depth
する-1
必要がある場合があります。depth == 0
そうすれば、常に権利を得ることができますdepth
。
編集: SKIP_SIBLINGS
fromvisitFile
ではなくfrom から戻った場合でもpreVisitDirectory
、postVisitDirectory
が呼び出されます!
コードサンプルは次のとおりです。
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);
}
}