package ch18io.directory;
import static java.nio.file.FileVisitResult.*; // Import constants
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
public class ListFiles extends SimpleFileVisitor<Path> {
// Output the directory path and set indent for entries
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attr) {
System.out.format("%n%sDirectory: %s contains:", indent, dir);
indent.append(" ");
return CONTINUE;
}
// Note error after walking directory and reset indent
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e) {
if (e != null) {
System.err.format("%n%sError walking directory: %s%n%s", indent, dir, e);
}
int len = indent.length();
indent.delete(len - 2, len);
return CONTINUE;
}
// Record file or symbolic link details
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
if (attr.isRegularFile()) {
System.out.format("%n%sFile: %s", indent, file);
} else if (attr.isSymbolicLink()) {
System.out.format("%n%sSymbolic link: %s", indent, file);
}
return CONTINUE;
}
// Record file visit failure
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
System.out.format("%n%sFile attributes could not be read for: %s%n%s",
indent, file, e);
return CONTINUE;
}
// Indent for entries
private StringBuilder indent = new StringBuilder(" ");
}