递归列出所有文件在给定的目录除了文件中隐藏的文件夹

问题描述:

我有下面的代码:递归列出所有文件在给定的目录除了文件中隐藏的文件夹

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

将返回文件名列表使用相对路径指定的路径内。 我不知何故被添加到附加文件结构中某处的所有隐藏文件夹中。有什么建议么?

+0

您可以过滤流以检查文件是否隐藏? –

+0

@AndriiAbramov这不工作,因为它只会忽略隐藏文件,我想要的是忽略隐藏目录中的文件 – Moonlit

您可以使用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());