除了隐藏文件夹中的文件

时间:2017-03-08 16:10:11

标签: java java-8

我有以下代码:

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

将返回给定路径中具有相对路径的文件名列表。 我不知何故被添加到了排除文件结构中某处隐藏文件夹中的所有文件。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以使用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 {{1 }属性已设置。“)

答案 1 :(得分:1)

尝试以下方法:

替换

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

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