3

我需要对目录中最后访问的文件做一些事情。我如何知道当前对我的呼叫visitFile()是否是最后一个呼叫?

(我只想列出给定目录中的所有文件和目录。为此,我在我的实现中引入了一个depth字段,如果深度大于 0 ,我将返回。(然后增加.)问题是我不知道何时将 重置为 0,因为当我使用此 FileVisitor 实现为另一个目录调用 时,已经 > 0 并且它只列出给定目录。)FileVisitorpreVisitDirectorySKIP_SUBTREEdepthdepthwalkFileTreedepth

4

1 回答 1

4

仅在这两种方法中保持深度怎么preVisitDirectorypostVisitDirectory?您将在 中增加depthpreVisitDirectory减少它postVisitDirectory。不过,您可能必须初始化depth-1, 才能depth == 0在开始目录中拥有 when 。这样,您将始终拥有正确的depth.

编辑:如果你返回SKIP_SIBLINGSfrom visitFile,而不是 from preVisitDirectorypostVisitDirectory仍然会被调用!

这是一个代码示例:

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);
}

}

于 2012-05-01T14:14:19.657 回答