PHP: Rekursives auslesen eines Ordners

Wir werden nun eine Funktion erstellen, welche uns einen beliebigen Ordner rekursiv ausliest. Das heisst dass die Ordnerstruktur und die Tochterstrukturen ausgelesen und dargestellt werden. wir wollen mit dem aufbau der funktion beginnen:

function getDir($dir) {
  $dh = opendir($dir);
  while($file = readdir($dh)) {
    echo $file.'<br>';
  }
  closedir($dh);
}

function getDir($dir) sollte klar sein. Die Funktion getDir wird erstellt und die Variable $dir wird übergeben. $dh = opendir($dir) öffnet den Ordner $dir und speichert die Information im Directory Handle $dh. while($file = readdir($dh)) ist eine Schleife welche das Directory Handle durchwandert und bei jedem Eintrag die Variable $file füllt. Mit echo $file geben wir diesen Wert von $file zurück. Ganz wichtig ist es dass der Ordner wieder geschlossen wird: closedir($dh); Nun werden aber auch . und .. ausgegeben. Das können wir verhindern indem wir eine IF-ELSE Kondition einbinden:

function getDir($dir) {
  $dh = opendir($dir);
  while($file = readdir($dh)) {
    if($file != "." && $file != "..") {
        echo "$file (file)<br>";
    }
  }
  closedir($dh);
}

Nun erhalten wir schon eine ganze „Wurst“ an Namen, aber wir möchten gern wissen ob es sich bei dem jeweiligen Eintrag um einen Ordner oder eine Datei handelt. Das können wir mit einer weiteren IF-ELSE Kondition erreichen:

function getDir($dir) {
  $dh = opendir($dir);
  while($file = readdir($dh)) {
    if($file != "." && $file != "..") {
      if(is_dir("$dir/$file")) {
        echo "$file [DIR]<br>";
      } else {
        echo "$file (file)<br>";
      }
    }
  }
  closedir($dh);
}

Mit if(is_dir()) prüfen wir ob es sich bei dem Eintrag um einen Ordner handelt. Wenn ja, wird der Eintrag mit einem [DIR] dahinter ausgegeben. Wenn nicht, handelt es sich um eine Datei und der Eintrag wird mit einem (file) ausgegeben. Bisher haben wir aber nur den Ordner ausgelesen welchen wir bestimmt hatten. Uns interessieren aber auch noch die Unterordner und dessen Inhalte. Jetzt sind wir bei der Rekursivität angelangt. Wir werden, sofern es sich bei einem Eintrag um einen Ordner handelt unsere Funktion getDir() veranlassen sich selbst aufzurufen:

function getDir($dir) {
  $dh = opendir($dir);
  while($file = readdir($dh)) {
    if($file != "." && $file != "..") {
      if(is_dir("$dir/$file")) {
        echo "$file [DIR]<br>";
        getDir("$dir/$file");
      } else {
        echo "$file (file)<br>";
      }
    }
  }
  closedir($dh);
}

Nun ist das Ganze schon recht informativ, sieht aber sehr unübersichtlich aus. Eine lange Auflistung ohne Struktur. Wir werden nun die Ausgabe so formatieren dass jeder Unterordner und dessen „Inhalt“ eingerückt und mit einem – gekennzeichnet wird. Wir übergeben zu diesem Zweck eine Variable $pre mit dem gewünschten Startwert. mit $pre.= „-“ wird dieser Startwert bei jedem erneuten Aufruf der Funktion um den angegebenen Wert erweitert, was dazu führt dass jeder Unterordner mit seinem Inhalt eingerückt und markiert ist.

function getDir($dir,$pre) {
  $pre.= "-";
  $dh = opendir($dir);
  while($file = readdir($dh)) {
    if($file != "." && $file != "..") {
      if(is_dir("$dir/$file")) {
        echo "$pre $file [DIR]<br>";
        getDir("$dir/$file",$pre);
      } else {
        echo "$pre $file (file)<br>";
      }
    }
  }
  closedir($dh);
}

Tags: , , , ,

6 Antworten zu “PHP: Rekursives auslesen eines Ordners”

  1. Rodrigo sagt:

    Das mit der whileschleofe schein nich so zu klappen bzw. erkennt er Ordner und öffnet die dann auch, aber in diesem ordner werden alle datein als file dargestellt. Zenstudio markiert auch die whileschleife… Schade sonnst wäre es echt ein kuhles Tutorial gewesen

  2. Promaetheus sagt:

    Natürlich markiert er alle Dateien in dem Ordner als FILE wenn es eine Datei ist. Oder wie meinst du das? Die Funktion läuft seit langem problemlos.

  3. Ribesal sagt:

    Also irgendetwas scheint da zufehlen, wenn ich den letzten Code kopiere passiert…nichts.
    Die komplette Seite bleibt einfach leer – kommt noch nichtmal nen Fehler bei raus.

  4. Promaetheus sagt:

    Es gibt mehrere Möglichkeiten. Die zwei naheliegendsten sind dass du 1. entweder keine Datei in dem jeweiligen Ordner gespeichert hast oder 2. dass du den Pfad zu dem Ordner nicht korrekt angegeben hast. Achte auch absoluten und/oder relativen Pfad!

  5. Petra Sander sagt:

    ….vielen Dank für diesen genialen Code,
    funktioniert einwandfrei…

  6. Franz Patzal sagt:

    Danke,
    das hat mir für meine selbstgestrickte Bildershow ( nur php-code ) noch gefehlt.
    Habe den code für meine Bedürfnisse erweitert.

Hinterlasse eine Antwort