无法使用Files.walkFileTree java 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()也不会执行。它正确地列出了所有常规文件,但没有列出目录。这里少了什么吗?

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

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

最新更新