无法使用Files.walkFileTree java nio在目录中打印子目录

时间:2014-09-07 13:54:32

标签: java file io nio

我正在运行此代码来遍历目录 -

import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class FindDirectoriesTest {
  public void find()
    throws IOException
  {
    Path dir = Paths.get("some_dir");
    Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException
        {
          if (attrs.isDirectory()) {
            //do something;
          } else {
            //do something else
          }
          return FileVisitResult.CONTINUE;
        }
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
        {
          return FileVisitResult.CONTINUE;
        }
      });
  }
}

问题是attrs.isDirectory()即使有目录也不会执行。它正确列出所有常规文件,但不列出目录。这里有什么遗漏吗?

2 个答案:

答案 0 :(得分:3)

bskaggs是对的。我在研究nio包时遇到了同样的问题。 然后找到了这个页面。想知道为什么这个问题没有得到回答或关闭,因为多年前就被问过了。 以下是打印您提供的路径的子目录列表的代码。

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class WalkTreeExample {
    public static void main(String[] args) throws IOException {
        Path p = Paths.get("C:\\Users");
        Files.walkFileTree(p, new SimpleFileVisitor<Path>()
        {            
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
            if(Files.isDirectory(dir))
                    System.out.println(dir);
            return FileVisitResult.CONTINUE;
            }                      
        });
    }
}

答案 1 :(得分:1)

visitFile仅在访问文件时调用,而不是在目录中调用。您应该添加另一个覆盖preVisitDirectorypostVisitDirectory的函数(取决于您是否希望在访问子目录中的所有文件之前或之后执行操作),并放置特定于目录的函数那里的逻辑。