Wie lese ich alle Dateinamen eines Verzeichnisses aus?

(Autor: FtR? & perl-community)

Unter der Verwendung von opendir und readdir.

        $dirname = ".";
        opendir (DIR, $dirname);
        @dir = readdir(DIR);
        closedir;
        

opendir bietet eine sichere Methode um Verzeichnisse zu öffnen.
readdir liest einen Eintrag aus dem Verzeichnis.
In unserem Beispiel hier wird dies in einem Listenkontext benutzt und daher das gesamte Verzeichnis ausgelesen und an das Array übergeben.
Nachteil: bei Verzeichnissen mit vielen Einträgen wird dieser Array sehr groß. Bei Verzeichnissen mit vielen unerwünschten Datei wäre es sinnvoll gleich beim Lesen des Dateinamen zu die Verarbeitung zu starten bzw. zu selektieren.
Dies ließe sich durch den Einsatz einer while-Schleife ermöglichen.

        $dirname= ".";
        opendir (DIR, $dirname);
        while ($file = readdir (DIR)){
        #einzelne Dateiverarbeitung
        }
        closedir;
        

Welche Variante man wählt, hängt ganz vom Einsatzbereich ab.
Diese Codefragmente haben jedoch einen entschiedenen Nachteil. Sie betrachten weder Fehler-, Rand- noch Sonderfälle. Will man sichergehen, das der Code auf etwaige Fehler reagiert muß man sich etwas mehr einfallen lassen.

  1. Das Öffnen des Zielverzeichnisses könnte unmöglich sein (nicht existent, nicht die nötigen Rechte etc.) dies ließe sich über den Verbund mit or die lösen.

            opendir(DH, $dname) or die "Kann Verzeichnis $dname nicht oeffnen";
            

  2. Jedoch läßt sich an Hand dieser Fehlermeldung unter Umständen das Problem nur schwer analysieren da als Verzeichnis angaben auf relative Pfad angaben zulässig sind. Hierbei hilft der Einsatz der Funktion cwd des Moduls Cwd. Diese Funktion liefer uns das aktuelle Verzeichnis zurück von dem aus alle relativen Pfadangaben bei opendir betrachtet werden müssen.

  3. Kann readdir einen Fehler liefern?
    Eigentlich nicht, da jedes Verzeichnis mindesten die Verzeichniseinträge "." und ".." enthält.

  4. Kann closedir ein Fehler liefern?
    Da wir in diesem Fall nur lesend aktiv sind, sind hier keine Fehler zu erwarten .

Der Ideale Code würde dann etwa so aussehen:

        #fuer Funktion cwd
        use Cwd;

        #aktuelles Arbeitsverzeichnis
        my $curdir = cwd;
        #zu durchsuchendes Verzeichnis (auch relative Pfadangaben sind moeglich)
        my $dname = ".";

        #Oeffnen des Verzeichnisses ueber DirectoryHandle
        opendir(DH, $dname) or die "Kann Verzeichnis $dname nicht oeffnen (aktuelles Verzeichnis ist $curdir): $!\n";
        #Einlesen des kompletten Verzeichnisinhaltes in Array
        my @dir = readdir(DH);
        #Schliessen des Verzeichnisses
        closedir(DH);

        #zeilenweises Ausgeben des Verzeichnisinhaltes
        print join("\n", @dir);
        

Ergänzungen, Kommentare

Es gibt auch die Möglichkeit, die Funktion glob("pattern") zu verwenden. Diese Funktion gibt alle Dateien in einer Liste aus, die auf das Pattern matchen. Der Vorteil hierbei ist, dass pattern ein Shell-Suchmuster enthalten kann, also z.B. * oder ?. Ein gravierender Nachteil ist, dass glob() mit Leerzeichen in Pattern nicht intuitiv umgeht und man hierbei oft Fehler machen kann.

-- PlTk - 12 Aug 2005

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden:
       ---### Main.??? - 14 Jul 2003 - Betreff
      

UtilFaqSubForm edit

Titel Wie lese ich alle Dateinamen eines Verzeichnisses aus?
Autor FtR? & perl-community
Bereich FaqEinUndAusgabe
Topic revision: r3 - 2005-08-12 - 19:48:19 - PlTk
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.