Wie lässt sich der gesamte Inhalt eines Verzeichnisses einschließlich seiner Unterverzeichnisse durchsuchen?
Die Beispielklasse enthält zwei Methoden. In main()
wird zunächst der String
des zu durchsuchenden
Verzeichnisses deklariert und mit diesem ein File
-Objekt
gebildet. Danach liefert die zweite Methode getPaths()
eine ArrayList, die dann durchlaufen und deren
Inhalt ausgegeben wird.
Die Methode getPaths()
durchläuft das als ersten Parameter übergebene
Verzeichnis und speichert die absoluten Pfade der dort
gefundenen Dateien und Verzeichnisse als File
-Objekte
in der als zweitem Parameter übergebenen, zunächst
leeren ArrayList
.
Dies geschieht folgendermaßen: Als erstes wird
geprüft, ob das übergebene File
-Objekt
auch wirklich ein Verzeichnis ist. Ist das nicht der Fall oder
ist einer der Parameter null
, so bricht die Methode
ab und gibt null
zurück. Der Inhalt des
Verzeichnisse wird dann durch die Methode listFiles()
in ein File
-Array eingelesen. Dies wird in einer
for-Schleife durchlaufen und dort jedes Element daraufhin
überprüft, ob es sich um ein Verzeichnis handelt.
Hier
wird nun das Verfahren der Rekursion angewendet:
Entspricht das gefundene File
-Objekt einem
Verzeichnis, so ruft sich getPaths()
selbst auf,
indem es das neu gefundene Verzeichnis als neuen ersten
Parameter übergibt. So steigt die Durchsuchung in dieses
Verzeichnis ab und fährt erst nach Abschluss von dessen
Durchsuchung an der bisherigen Stelle fort. Dies kann beliebig
oft und tief erfolgen.
Wenn das gefundene File
-Objekt
kein Verzeichnis und somit eine Datei ist, so wird deren Pfad
zur ArrayList
hinzugefügt. Sie wird dann nach
Abschluss des Auslesens von der Methode zurück gegeben.
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class VerzeichnisDurchsuchen {
public static void main(String[] args) {
String verzName = "/Users/joecze/Desktop/test/";
ArrayList<File> files = getPaths(new File(verzName),
new ArrayList<File>());
if(files == null) return;
try {
for (int i = 0; i < files.size(); i++)
System.out.println(files.get(i).getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
}
private static ArrayList<File> getPaths(File file, ArrayList<File> list) {
if (file == null || list == null || !file.isDirectory())
return null;
File[] fileArr = file.listFiles();
for (File f : fileArr) {
if (f.isDirectory()) {
getPaths(f, list);
}
list.add(f);
}
return list;
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.