Wie kann ich in Java nur Unterverzeichnisse aus einem Verzeichnis auflisten?
Ich möchte die Java.io.File-Funktion verwenden. Was ist die beste Methode in Java, um dies zu tun?
Sie können die File class verwenden, um die Verzeichnisse aufzulisten.
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));
Update
Kommentar des Autors zu diesem Beitrag wollte einen schnelleren Weg, großartige Diskussion hier: Wie kann man eine Liste von Verzeichnissen schnell in Java abrufen?
Grundsätzlich gilt:
Eine sehr einfache Java 8-Lösung:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Dies entspricht der Verwendung eines FileFilter (funktioniert auch mit älterem Java):
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
@Mohamed Mansour du warst fast da ... das "dir" -Argument, das du benutzt hast, ist eigentlich der kurvenreiche Pfad, also wird es immer wahr sein. Um zu sehen, ob das Kind ein Unterverzeichnis ist oder nicht, müssen Sie dieses Kind testen.
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));
Falls Sie an einer Lösung mit Java 7 und NIO.2 interessiert sind, könnte dies folgendermaßen aussehen:
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();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
Die Lösung, die für mich funktioniert hat, fehlt in der Liste der Antworten. Daher poste ich diese Lösung hier:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
Hier habe ich org.Apache.commons.io.filefilter.FileFilterUtils
von Apache commons-io-2.2.jar verwendet. Die Dokumentation finden Sie hier: https://commons.Apache.org/proper/commons-io/javadocs/api-2.2/org/Apache/commons/io/filefilter/FileFilterUtils.html
Ich möchte die Java.io.File-Funktionalität nutzen,
2012 (Datum der Frage) ja, heute nicht. Java.nio
API muss für solche Anforderungen bevorzugt werden.
Schrecklich mit so vielen Antworten, aber nicht der einfache Weg, den ich benutzen würde, ist Files.walk().filter().collect()
.
Global sind zwei Ansätze möglich:
1) Files.walk(Path start, )
hat währenddessen keine maxDepth
Einschränkungen
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
ermöglicht die Einstellung.
Ohne Angabe einer Tiefenbegrenzung würde es geben:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Und wenn Sie aus älteren Gründen eine Liste von File
benötigen, können Sie vor dem Sammeln einfach eine map(Path::toFile)
-Operation hinzufügen:
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Ein Startverzeichnis als String
angegeben
String
-Pfad als Parameter verwendet. In der Methode:listFiles
ein Array von Dateien im aktuellen Verzeichnis abHier ist die Lösung für meinen Code. Ich habe gerade eine kleine Änderung von der ersten Antwort vorgenommen. Dadurch werden alle Ordner nur im gewünschten Verzeichnis zeilenweise aufgelistet:
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!");
}
Für diejenigen, die auch an Java 7 und NIO interessiert sind, gibt es eine alternative Lösung zu @ voo's Antwort oben . Wir können ein try-with-resources verwenden, das Files.find()
aufruft, und eine Lambda-Funktion, mit der die Verzeichnisse gefiltert werden.
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) {
...
}
Wir können Verzeichnisse sogar nach Namen filtern, indem Sie die Lambda-Funktion ändern:
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
oder nach Datum:
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