2017-03-08 97 views
1

我有下面的代碼:遞歸列出所有文件在給定的目錄除了文件中隱藏的文件夾

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

將返回文件名列表使用相對路徑指定的路徑內。 我不知何故被添加到附加文件結構中某處的所有隱藏文件夾中。有什麼建議麼?

+0

您可以過濾流以檢查文件是否隱藏? –

+0

@AndriiAbramov這不工作,因爲它只會忽略隱藏文件,我想要的是忽略隱藏目錄中的文件 – Moonlit

回答

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 hidden屬性被設置,則該文件被認爲是隱藏的。」 )

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()); 
相關問題