Inhalt
Vorwort
Was lerne ich hier?
Hier lernst, du wie du mit Hilfe der Rekursion eine verbesserte mkdir()-Funktion erstellst.
Wie benutze ich dieses Tutorial?
In diesem Tutorial wird dir wahrscheinlich viel Unbekanntes begegnen. Solltest du einen Beispielcode nicht verstehen, gib nicht gleich auf. Meist habe ich bei etwas komplizierten Funktionen oder Konstrukten vorher eine entsprechende Info mit einem weiterführendem Link eingefügt. Es lohnt sich, diese Links im Zweifelsfall zu verfolgen.
Die folgenden Symbole werden dir im Tutorial öfters begegnen:
Hinter diesem Symbol verbergen sich wichtige Infos
Hier findest du weiterführende oder zusätzliche Informationen zum aktuellen Kapitel
Sollte dir ein Konstrukt oder eine Funktion unbekannt erscheinen, oder solltest du Probleme bekommen, halte nach diesem Symbol Ausschau.
1. Unser Problem Wenn du schonmal mit der Funktion mkdir() gearbeitet hast, wirst du vielleicht schon mal folgende Fehlermeldung gesehen haben:
Warning: mkdir() [function.mkdir]: Datei oder Verzeichnis nicht gefunden in /opt/lampp/htdocs/Test3.php on line 14
In dem beschriebenen Fall habe ich mkdir() folgendermaßen aufgerufen:
PHP-Code:
mkdir("/opt/lampp/htdocs/project/gallery_2/thumbs");
Ich habe versucht, in einem meiner Projektordner einen Gallerieordner und darin einen Ordner für die Thumnails zu erstellen.
Allerdings kann mkdir() bei so einem Aufruf nur einen Ordner erstellen, wenn der Rest der Verzeichnisstruktur bereits besteht.
Also müsste der Ordner
Code:
/opt/lampp/htdocs/project/gallery_2
Diesem Problem kann man nun in zwei Versionen entgegen wirken.
Wenn man bereits für PHP 5 entwickeln kann man die Besonderheit von mkdir() nutzen, Verzeichnisse rekursiv zu erstellen (s. Manual).
Oder wir basteln uns die entsprechende Funktion selber. Immerhin haben wir ja bereits das Handwerkszeug gelernt. Und außerdem kann man nicht immer davon aus gehen, dass unsere Skripts auf einem Server mit PHP 5 laufen.
Dann wollen wir mal anfangen.
2. Der Ansatz
Zuerst sollten wir uns den Ansatz überlegen.
Können wir überhaupt unser Problem rekursiv lösen?
Ich habe folgenden Ansatz gefunden:
Wir überprüfen zuerst, ob das zu erstellende Verzeichnis schon existiert. (Das ist unsere Abbruchbedingung. Wenn ja, machen wir nichts).
Wenn es noch nicht existiert, prüfen wir, ob das übergeordnete Verzeichnis existiert. Wenn ja, erstellen wir das Verzeichnis, dass uns übergeben wurde und sind fertig.
Wenn das übergeordnete Verzeichnis nicht existiert, überprüfen wir, ob das darüber existiert, und immer so weiter, bis endlich ein Verzeichnis existiert, was spätestens bei / so sein wird.
Was heißt das nun konkret an unserem Beispiel?
uns wird folgendes Verzeichnis übergeben
Code:
/opt/lampp/htdocs/project/gallery_2/thumbs
Code:
/opt/lampp/htdocs/project
Nun überprüfen wir, ob
Code:
/opt/lampp/htdocs/project/gallery_2
Das ist nicht der Fall, also prüfen wir, ob
Code:
/opt/lampp/htdocs/project
Dies existiert und darum können wir
Code:
/opt/lampp/htdocs/project/gallery_2
Nun können wir auch
Code:
/opt/lampp/htdocs/project/gallery_2/thumbs
Code:
/opt/lampp/htdocs/project/gallery_2/thumbs
Code:
/opt/lampp/htdocs/project/gallery_2
Code:
/opt/lampp/htdocs/project/gallery_2/thumbs
Code:
/opt/lampp/htdocs/project/gallery_2
Code:
/opt/lampp/htdocs/project
Code:
/opt/lampp/htdocs/project/gallery_2
Code:
/opt/lampp/htdocs/project
3. Die Planungsphase
Überlegen wir uns mal ein paar Punkte:
- Unser Problem, das wir rekursiv aufrufen, ist, nacheinander zuerst den übergeordnete Ordner zu erstellen und danach den eigentlichen Ordner.
- Was ich übergeben können muss, ist eindeutig der zu erstellenden Ordner als String.
- Wir wollen zuerst überprüfen, ob der übergebene Ordner bereits existiert. Existiert er bereits, wollen wir keinen weiteren rekursiven Aufruf.
- Existiert der Ordner bereits soll nichts geschehen. Es ist keine Aktion notwendig.
- Wenn er noch nicht existiert, soll die Funktion rekursiv mit dem übergeordneten Ordner aufgerufen werden. Wir brauchen also den übergeordneten Ordner als String.
- Die einzelnen Probleme lösen sich dadurch, dass sie ggf. ihren übergebenen Ordner erstellen. Dadurch vereinen sich alle Lösungen zur Lösung des Originalproblems. Eine besondere Aktion (Summe, etc.) ist nicht nötig. Daher muss auch nichts zurückgegeben werden.
- Da wir keine "negativen" Pfadangaben angeben können und jede Ordnerstruktur erfolgreich auf / reduzieren können, müssen wir nicht mit einer Endlosschleife rechnen.
4. Wir bauen die Funktion
Nachdem wir uns also diese Gedanken gemacht haben, können wir loslegen.
Unsere Funktion braucht zuerst einmal einen Namen.
PHP-Code:
function mkdir_rek($dir) {
}
Nun fügen wir unsere Abbruchbedingung und unseren nicht-rekursiven Weg ein.
Unsere Abbruchbedingung ist, dass der Ordner bereits existiert. Da in diesem Fall keine Aktion statt findet, ist auch nichts zu sehen, als die if-Abfrage.
PHP-Code:
functio mkdir_rek($dir) {
if (!is_dir($dir) {
}
}
Wir benötigen ja den übergeordneten Ordner. Dabei hilft uns die Funktion dirname(). Sie ermöglicht es uns aus /opt/lampp/htdocs/project/gallery_2/thumbs/opt/lampp/htdocs/project/gallery_2 zu machen. Also den übergeordneten Ordner.
Den wollen wir dann durch die Funktion schicken und danach /opt/lampp/htdocs/project/gallery_2/thumbs per mkdir() erstellen.
Das ganze sieht dann so aus:
PHP-Code:
function mkdir_rek($dir) {
if (!is_dir($dir)) {
mkdir_rek(dirname($dir));
mkdir($dir);
}
}
Ich habe dir hier die Funktion als php-Script angehängt.
Nur habe ich sie dahingehend verbessert, als dass man nun auch die Maskierung der neu erstellten Ordner angeben kann.

Bereiche
Kategorien (Alle Bereiche)
Neue Beiträge