Wie kann man Verzeichnisse eines bestimmten Namens in einem Dateibaum finden?

Das Grundprinzip besteht in der rekursiven Durchsuchung des Baumes. Die Schlüsselmethode ist hierbei listFiles() aus der Klasse java.io.File. Sie erstellt ein Array der in einem Verzeichnis gefundenen File-Objekte.

Das Beispiel zeigt eine Methode, die alle Verzeichnisse eines bestimmten Namens in einer ArrayList speichert und diese zurück gibt. Sie erwartet fünf Parameter:

File root Das Verzeichnis, das als Ausgangspunkt der Suche dient. Es wird mit seinen Unterverzeichnissen rekursiv durchsucht.
String dirName Der Name des gesuchten Verzeichnisses
ArrayList<File> list Die ArrayList, die die gefundenen File-Objekte speichert. Beim Aufruf der Methode kann hier null angegben werden. Wird beim Methodenaufruf hier eine vorbelegte ArrayList übergeben, so werden die ermittelten File-Objekte am Ende hinzugefügt.
boolean caseSensitivity Soll die Suche nach dem Verzeichnisnamen zwischen Groß- und Kleinschreibung unterscheiden, muss hier true angegeben werden.
boolean printEmpty Wird dieser Wert true gesetzt, so werden die Namen leerer Verzeichnisse auf der Konsole zusätzlich ausgegeben.

import java.io.File;
import java.util.ArrayList;

public class VerzeichnisseSuchen {

    public static ArrayList<File> listDirectories(File root, String dirName,
            ArrayList<File> list, boolean caseSensitivity, boolean printEmpty) {
        if (root == null || dirName.isEmpty()) {
            System.err
                    .println("Ausgangsverzeichnis oder gesuchter Verzeichnisname fehlt!");
            return null;
        }
        if (list == null)
            list = new ArrayList<File>();
        File[] files = root.listFiles();
        if (files.length != 0) {
            for (File file : files) {
                String fileStr = file.toString();
                if (!caseSensitivity) {
                    fileStr = fileStr.toLowerCase();
                    dirName = dirName.toLowerCase();
                }
                if (fileStr.lastIndexOf(dirName) == fileStr.length()
                        - dirName.length()
                        && file.isDirectory()
                        && file.getName().equalsIgnoreCase(dirName)) {
                    list.add(file);
                }
                if (file.isDirectory()) {
                    listDirectories(file, dirName, list, caseSensitivity,
                            printEmpty);
                }
            }
        } else if (printEmpty) {
            System.out.println(root + " ist leer!");
        }
        return list;
    }

    public static void main(String[] args) {
        ArrayList<File> list = listDirectories(new File(
                "/home/test"), "leer", null, false, false);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }
    }
}

Die Methode führt zunächst einige Sicherheitsabfragen durch, in denen sichergestellt wird, dass das Ausgangsverzeichnis, der Name des gesuchten Verzeichnisses und eine ArrayList übergeben wurden. Dann wird der Inhalt des Ausgangsverzeichnisses in einem File-Array abgelegt und auf weitere Verzeichnisse durchsucht. Hierbei wird die Prüfung des Namens in Abhängigkeit vom Parameter caseSensitivity ggf. unter Beachtung der Schreibweise durchgeführt. Repräsentiert das File-Objekt ein Verzeichnis, so wird die Methode erneut aufgerufen. Als Ausgangsverzeichnis wird in diesem Fall das gefundene Verzeichnis übergeben. Da die ArrayList mit weitergegeben wird, kann sie incrementell weiter gefüllt und im Baum allmählich abgestiegen werden.