我需要对目录中最后访问的文件执行某些操作。如何知道当前对visitFile()
的呼叫是否是最后一次?
(我只想列出给定目录中的所有文件和目录。为此,我在我的depth
实施和FileVisitor
中引入了preVisitDirectory
字段。如果深度大于0,我返回SKIP_SUBTREE
。然后递增depth
。)问题是我不知道何时将depth
重置为0,因为当我使用此FileVisitor实现为另一个目录调用walkFileTree
,depth
已经> 0并且它只列出给定目录。)
答案 0 :(得分:4)
如何仅在preVisitDirectory
和postVisitDirectory
两种方法中保持深度?您将在depth
中增加preVisitDirectory
并在postVisitDirectory
中减少depth
。您可能需要将-1
初始化为depth == 0
,以便在启动目录中时depth
。这样,您将始终拥有正确的SKIP_SIBLINGS
。
修改:如果您从visitFile
返回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);
}
仍会被调用!
以下是代码示例:
{{1}}
}