java - 递归列出给定目录中的所有文件,隐藏文件夹中的文件除外

标签 java java-8

我有以下代码:

Files.find( startPath, Integer.MAX_VALUE, ( path, attributes ) -> path.toFile().isFile() )
            .map( p -> startPath.relativize( p ).toString() ).collect( Collectors.toList() );

这将返回给定路径内具有相对路径的文件名列表。 我不知何故被困在 additoinally 排除所有放置在文件结构中某处隐藏文件夹中的文件。有什么建议吗?

最佳答案

您可以使用 Files.walkFileTree而不是 Files.find:

List<String> files = new ArrayList<>();

Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file,
                                     BasicFileAttributes attr)
    throws IOException {
        if (attr.isRegularFile()) {
            files.add(startPath.relativize(file).toString());
        }
        return super.visitFile(file, attr);
    }

    @Override
    public FileVisitResult preVisitDirectory(Path dir,
                                             BasicFileAttributes attr)
    throws IOException {
        if (Files.isHidden(dir) ||
            (attr instanceof DosFileAttributes && 
                ((DosFileAttributes) attr).isHidden())) {

            return FileVisitResult.SKIP_SUBTREE;
        }
        return super.preVisitDirectory(dir, attr);
    }
});

代码看起来比较长,但是效率不亚于Files.find。

(如果您想知道为什么 DosFileAttributes 的具体处理在那里,那是因为 documentation for Files.isHidden 指出,“在 Windows 上,如果文件不是目录并且 DOS 隐藏 属性已设置。”)

关于java - 递归列出给定目录中的所有文件,隐藏文件夹中的文件除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676320/

相关文章:

java - 从java在mysql中创建一个数据库

java - 多页 Tiff 压缩

java - 使用 FXMLLoader 时出现 IllegalAccessError

Java 8 : Better to extend class of static methods or better to call static methods directly?

Java 8流聚合一张图

lambda - Java8 lambda 是否像匿名类一样维护对其封闭实例的引用?

java - Spring Security : SecurityContextHolder. getContext().getAuthentication() 在用户注册用户并重定向到登录后页面后返回 null

具有只有一种方法的抽象类的 Java 8 lambda 表达式

java - 从 Java 8 流 forEach 中断还是返回?

java - 如何在其他java Selenium之后运行一个类