Java, liste seulement des sous-répertoires d'un répertoire, pas des fichiers

en Java, Comment puis-je lister uniquement les sous-répertoires d'un répertoire?

j'aimerais utiliser le java.io.Fonctionnalité des fichiers, Quelle est la meilleure méthode en Java pour faire cela?

69
demandé sur Eric Leschinski 2011-02-26 08:23:07

7 réponses

vous pouvez utiliser la classe File pour lister les répertoires.

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

mise à Jour

commentaire de l'auteur sur ce post voulu un moyen plus rapide, grande discussion ici: comment récupérer rapidement une liste de répertoires en Java?

en gros:

  1. si vous contrôlez la structure du fichier, j'essaierais d'éviter arriver dans cette situation.
  2. in Java NIO.2, vous pouvez utiliser les répertoires fonction retourne un itérateur pour permettre une plus grande échelle. La classe directory stream est un objet que vous pouvez utiliser pour itérer les entrées d'un répertoire.
113
répondu Mohamed Mansour 2017-05-23 11:47:29

une solution Java 8 très simple:

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

c'est l'équivalent de L'utilisation d'un FileFilter (fonctionne aussi avec L'Ancien Java):

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});
75
répondu headsvk 2015-12-29 10:22:04

@Mohamed Mansour vous y étiez presque... l'argument " dir " que vous utilisiez est en fait le chemin curent, donc il retournera toujours true. Pour voir si l'enfant est un sous-répertoire ou pas, vous devez tester cet enfant.

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));
13
répondu Javier Buzzi 2011-08-19 23:50:45

au cas où vous seriez intéressé par une solution utilisant Java 7 et NIO.2, il pourrait aller comme ceci:

private static class DirectoriesFilter implements Filter<Path> {
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
}

try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
        for (Path p : ds) {
            System.out.println(p.getFileName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
6
répondu voo 2013-07-13 09:53:58

donne un répertoire de départ comme String

  1. créez une méthode qui prend un chemin String comme paramètre. Dans la méthode:
  2. créer un nouveau fichier objet basé sur le répertoire de départ
  3. obtenez un tableau de fichiers dans le répertoire courant en utilisant la méthode listFiles 151970920" Boucle
  4. sur le tableau de fichiers
    1. Si c'est un fichier, continuer la boucle
    2. si c'est un répertoire, imprimez le nom et recurse sur ce nouveau chemin de répertoire
0
répondu Jonathon Faust 2011-02-26 05:29:51

Voici la solution pour mon code. Je viens de faire un petit changement de la première réponse . Cela va énumérer tous les dossiers seulement dans la ligne de répertoire désirée par ligne:

try {
            File file = new File("D:\admir\MyBookLibrary");
            String[] directories = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                return new File(current, name).isDirectory();
              }
            });
            for(int i = 0;i < directories.length;i++) {
                if(directories[i] != null) {
                    System.out.println(Arrays.asList(directories[i]));

                }
            }
        }catch(Exception e) {
            System.err.println("Error!");
        }
0
répondu Tabby Auguste 2018-04-29 10:06:01

pour ceux également intéressés par Java 7 et NIO, il existe une solution alternative à la réponse de de @voo au-dessus de . Nous pouvons utiliser un try-with-resources qui appelle Files.find() et une fonction lambda qui est utilisée pour filtrer les répertoires.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;


final Path directory = Paths.get("/path/to/folder");

try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
    paths.forEach(System.out::println);
} catch (IOException e) {
    ...
}

nous pouvons même filtrer les répertoires par leur nom en changeant la fonction lambda:

(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")

ou par date:

final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();

// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday
0
répondu HugoTeixeira 2018-08-01 23:31:28