Newsflash
Downloads
In der Download Section findet ihr Programme und andere Dinge zum downloaden.
 

User Login

Home
Rekursion (oder: Dateilisten unter PHP) PDF Drucken E-Mail
Geschrieben von Mitja Schmakeit   
Tuesday, 20. November 2007
Möchte man Herausfinden, welche oder wie viele Dateien sich in einem Ordner und allen seiner Unterordner befinden, so muss man jede einzelne Datei durchlaufen. Fakt ist, dass man mit Hilfe eines dir-Pseudoobjekts aber immer nur einen Ordner durchlaufen kann. Stößt man auf einen Unterordner, so muss man diesen wieder mit der gleichen Funktion aufrufen. Für dieses Problem ist Rekursion wohl die beste lösung: Die Funktion ruft sich selbst auf, für jeden gefundenen Ordner. Erst einmal will ich die Funktionsweise der Funktion dir($path) beschreiben. Diese Funktion gibt ein Pseudo-Objekt zurück, welches hier näher beschrieben ist.

Code:
<?php $dirtocheck = "./"; if (!is_dir($dirtocheck)) { die("'$dirtocheck' is no directory!"); } $d = dir($dirtocheck); while (($entry = $d->read()) !== FALSE) { echo $entry."<br>"; } ?>
Output (Bsp.):
. .. 01189998819991197253.txt cgi include index.php


Mal den Code überfliegen: Zuerst geben wir das auszugebene Verzeichnis an, dann überprüfen wir mit is_dir() ob es ein Verzeichnis ist. Als nächstes erzeugen wir via dir() das Dir-Pseudoobjekt, welches wir in $d ablegen. Dieses kennt die Methode "read", die wir dann so lange benutzen, bis sie FALSE zurückgibt. Wichtig ist hierbei die explizite Überprüfung, ob der Rückgabewert identisch (===) mit FALSE ist, da sonst jeder Ordner, der zu False bei einer einfachen überprüfung ausgewertet werden würde, automatisch die Schleife beenden würde. In der Schleife wird dann nur noch das Gefundene ausgegeben.


Nun zur Rekursion. Dazu müssen wir die Schleife in einer Funktion verpacken. Nun soll bei jedem $entry überprüft werden, ob es sich um ein Verzeichnis handelt. Wenn das so ist, muss die gleiche Funktion aufgerufen werden, nur muss hier der Unterordner als Parameter angegeben werden. Desweiteren fügen wir hier eine Funktion zu, um etwaige fehlende Schrägstriche am Ende zu ergänzen, damit wir das ganze auch korrekt ausgeben können.

Code:
function addslash($so){if ($so[strlen($so) - 1] != "/"){$so .= "/";} return $so;} function recdir($rd) { $rd = addslash($rd); $d = dir($rd); while (($entry = $d->read()) !== false) { if ($entry != "." && $entry != "..") //. und .. nerven bei Rekursion ;) { echo $rd."\n$entry<br />"; //Hier wird der überprüfte Ordner $rd mit angegeben. if (is_dir($rd.$entry)) //Wenn der Eintrag ein Ordner ist... { recdir($rd.$entry."/"); //...rufe dich selbst mit diesem Ordner auf. } } } } $dirtocheck = "./"; if (!is_dir($dirtocheck)) { die("'$dirtocheck' is no directory!"); } recdir($dirtocheck);
Output (Bsp.):
./01189998819991197253.txt ./cgi ./cgi/wtf.cgi ./include ./include/all_your_base_are_belong_to.us ./include/and_neither_this.inc ./include/do_not_include_this.inc ./index.php


Wie man sieht, ist Rekursion nicht wirklich schwer, aber man kann sie in nahezu allen Programmiersprachen immer mal wieder gebrauchen. Was ihr nun aus diesem Dateianzeige-Skript macht (vielleicht ja ein ganzes Galerie-Tool o.Ä.), ist eure Sache.
Letzte Aktualisierung ( Wednesday, 21. November 2007 )
 
< Zurück

Who's Online

Aktuell 3 Gäste online
Invalid XHTML (Valid XHTML destroyed by some components), Valid CSS - Design by ah-68 - Copyright © 2007 - 2012 by Mitja Schmakeit - Hosted by taruner.de