2017-03-08 4 views
1

Ich habe das folgende Stück Code:Liste alle Dateien rekursiv in einem bestimmten Verzeichnis außer Dateien in versteckten Ordnern

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

, das eine Liste von Dateinamen mit relativem Pfad innerhalb einer vorgegebenen Bahn zurück. Ich bin irgendwie daran gehindert, alle Dateien, die in versteckten Ordnern irgendwo entlang der Dateistruktur platziert werden, auszuschließen. Irgendwelche Vorschläge? statt Files.find

+0

Sie können den Stream filtern, um zu prüfen, ob die Datei versteckt ist? –

+0

@AndriiAbramov das funktioniert nicht, da es nur versteckte Dateien ignorieren wird, was ich will ist, Dateien zu ignorieren, die in versteckten Verzeichnissen sind – Moonlit

Antwort

1

können Sie Files.walkFileTree verwenden:

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); 
    } 
}); 

Der Code mehr sieht, aber es ist nicht weniger effizient als Files.find.

(Wenn Sie sich fragen, warum die spezifische Behandlung von DosFileAttributes da drin ist, ist es, weil die documentation for Files.isHidden heißt es: „Unter Windows eine Datei versteckt angesehen wird, wenn es kein Verzeichnis ist und das DOS hidden Attribut gesetzt ist.“

)
1

Versuchen Sie folgendes:

ersetzen

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

mit

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()); 
Verwandte Themen