我有以下代码:
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/