【问题标题】:Can not print sub directory inside a directory using Files.walkFileTree java nio无法使用 Files.walkFileTree java nio 打印目录内的子目录
【发布时间】:2014-09-07 13:54:32
【问题描述】:

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

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()即使有目录也不会执行。它正确列出了所有常规文件,但没有列出目录。这里有什么遗漏吗?

【问题讨论】:

    标签: java file io nio


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-05-01
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2023-03-15
        相关资源
        最近更新 更多