[英]How to know when the last file is being visited in FileVisitor?
我需要對目錄中訪問過的文件做一些事情。 我怎么知道當前對visitFile()
調用是否是最后一次?
(我只想列出指定目錄下的所有文件和目錄。要做到這一點,我介紹了一個depth
領域我FileVisitor
實施,並在preVisitDirectory
我回到SKIP_SUBTREE
如果深度大於0(然后遞增depth
。)問題是我不知道何時將depth
重置為0,因為當我用另一個目錄的FileVisitor實現調用walkFileTree
時, depth
已經> 0並且它只列出給定的目錄。)
如何僅在兩個方法中保持深度, preVisitDirectory
和postVisitDirectory
? 你會增加depth
在preVisitDirectory
和遞減它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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.