如何維持深度只有在兩種方法中,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);
}
}
「目錄中的最後一個文件」,如按升序排列的名字嗎?降序?上一次更改?我不認爲他們是以任何特定的順序列出的... – Puce
沒錯,它看起來像文件被訪問的名字升序,我不知道如何我可以改變,如果我想。但是,訂單並不重要。我只想知道「何時」是最後一次調用'visitFile()'(即類似於'if(!hasMoreFilesToVisit())')的東西,而不管訪問順序如何。 (或者,如果在'_walkFileTree_'返回之前調用_just_方法可以擴展..)無論如何,你說的「目錄中的最後一個文件」是錯誤的。將其編輯爲「在目錄中最後訪問的文件」。 – Bloke