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?
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:
- si vous contrôlez la structure du fichier, j'essaierais d'éviter arriver dans cette situation.
- 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.
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();
}
});
@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));
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();
}
donne un répertoire de départ comme String
- créez une méthode qui prend un chemin
String
comme paramètre. Dans la méthode: - créer un nouveau fichier objet basé sur le répertoire de départ
- obtenez un tableau de fichiers dans le répertoire courant en utilisant la méthode
listFiles
151970920" Boucle - sur le tableau de fichiers
- Si c'est un fichier, continuer la boucle
- si c'est un répertoire, imprimez le nom et recurse sur ce nouveau chemin de répertoire
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!");
}
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