Donnerstag, 27. Januar 2011

Kleinigkeiten: Einen Ordner durchlaufen

Manchmal dürfen es auch Kleinigkeiten sein:
PHP bietet mehrere Möglichkeiten einen Ordner zu durchlaufen.
Die gängigsten sollen an dieser Stelle als kleine Merkhilfe aufgeführt werden.
"Glob" als einer weitere Möglichkeit soll in den nächsten Tagen ein eigener Beitrag gewürdigt werden.

Gemeinsam ist allen hier vorgestellten Funktionen, dass der Dateiname ohne Pfad zurückgegeben wird. Unterschiede in der Ausführungsgeschwindigkeit sind gering und sollten vernachlässigbar sein.

In den Beispielen wollen wir die Ausgabe auf Dateien mit bestimmten Merkmalen, zum Beispiel einer bestimmten Dateiendung beschränken.

opendir

Mit "opendir" wird ein Dateihandle erzeugt, der mit "readdir()" sequentiell ausgelesen werden kann.
Auf eine korrekte Sortierung sollte man sich bei "opendir" nicht verlassen.
Mit "rewinddir()" kann der ganze Spaß jederzeit wieder von vorne beginnen.

$VerzeichnisHandle = opendir($Ordner);
        while ($Datei = readdir($VerzeichnisHandle))
        {
            if (stripos($Datei, '.jpg')!==false)
            {
                echo $Datei."\n";
            };
        };
        closedir($VerzeichnisHandle);

scandir

"scandir" liest einen Ordner in einem Rutsch in ein Array das weiter bearbeitet werden kann. Freundlicherweise ist das Ergebnis bereits sortiert. Wer jetzt fragt ob "scandir" auch ein Äquivalent zu "rewinddir()" hat muss ohne Abendbrot ins Bett.

$VerzeichnisArray = scandir($Ordner);
        foreach ($VerzeichnisArray as $Datei)
        {
            if (stripos($Datei, '.jpg')!==false)
            {
                echo $Datei."\n";
            };
        }

dir

"dir" ist vereinfacht gesagt "opendir" getrimmt auf objektorientieren Code - man möge es mir verzeihen.
Wir erhalten als Ergebnis die reinen Dateinamen, könnnen den Pfad aber mit "$Objekt->path" abfragen. "$Objekt->path" kann mit eigenen Werten überschrieben werden, was aber keinerlei Auswirkungen hat, der Ordner wird dadurch nicht gewechselt.
Das Äquivalent zu "rewinddir()" ist "$Objekt->rewind()".

$Suche = dir($Ordner);
   while ( $Datei = $Suche->read() ){
     if (stripos($Datei, '.jpg')!==false){
       echo $Datei."\n";
     };
   }
  $Suche->close();
Hinweis: Die Funktionen "readdir()" und "read()" führen in der while-Schleife zu einem fehlerhaften Abbruch falls eine Datei oder ein Ordner "0" heißt. "0.txt", "00" oder Dateinamen wie "false" werden korrekt verarbeitet. Kann man nicht sicherstellen, dass "0" als Name nicht auftritt, muss die Bedingung in der While-Schleife typsicher mit "($Datei = readdir($VerzeichnisHandle))!==false" abgefragt werden. Danke für den Kommentar dazu.

Ich denke "glob" ist etwas spannender - versprochen...

Keine Kommentare:

Kommentar veröffentlichen