递归列出所有文件在给定的目录除了文件中隐藏的文件夹
问题描述:
我有下面的代码:递归列出所有文件在给定的目录除了文件中隐藏的文件夹
Files.find(startPath, Integer.MAX_VALUE, (path, attributes) -> path.toFile().isFile())
.map(p -> startPath.relativize(p).toString()).collect(Collectors.toList());
将返回文件名列表使用相对路径指定的路径内。 我不知何故被添加到附加文件结构中某处的所有隐藏文件夹中。有什么建议么?
答
您可以使用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 hidden
属性被设置,则该文件被认为是隐藏的。” )
答
尝试以下操作:
更换
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());
您可以过滤流以检查文件是否隐藏? –
@AndriiAbramov这不工作,因为它只会忽略隐藏文件,我想要的是忽略隐藏目录中的文件 – Moonlit