我需要对目录中最后访问的文件执行一些操作。我如何知道对visitFile()的当前调用是否是最后一个调用?
(我只想列出给定目录中的所有文件和目录。为此,我在FileVisitor实现中引入了depth字段,如果深度大于0,则在preVisitDirectory中返回SKIP_SUBTREE。(然后递增depth。)问题是我不知道何时将depth重置为0,因为当我使用这个FileVisitor实现为另一个目录调用walkFileTree时,depth已经大于0,并且它只列出了给定的目录。)
发布于 2012-05-01 22:14:20
如果只在preVisitDirectory和postVisitDirectory这两个方法中保持深度呢?您将在preVisitDirectory中递增depth,在postVisitDirectory中递减它。您可能必须将depth初始化为-1,以便在启动目录中具有depth == 0。这样,您将始终拥有正确的depth。
编辑:如果你从visitFile返回SKIP_SIBLINGS,而不是从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);
}}
https://stackoverflow.com/questions/10397711
复制相似问题