PHP/Umgang mit Verzeichnissen
Funktionsübersicht
Die folgende Tabelle zeigt alle Funktionen, die beim Umgang mit Verzeichnissen von Bedeutung sind.
Funktion | Beschreibung |
---|---|
chdir | Wechselt das aktuelle Verzeichnis. Die Funktion verlangt eine eindeutige Pfadangabe. |
dir | Eine Klasse, die mit Verzeichnissen umgeht. |
closedir | Schliesst ein Verzeichnis. Benötigt wird ein Handle. |
mkdir | Erstellt ein neues Verzeichnis und gibt ein Handle darauf zurück. |
opendir | Öffnet ein Verzeichnis und gibt ein Handle darauf zurück. |
readdir | Liest anhand des übergebenen Handles den nächsten Eintrag aus einem Verzeichnis. |
rewinddir | Setzt den Zeiger für die Funktion "readdir" wieder an den Anfang. |
rmdir | Löscht ein Verzeichnis. |
Verarbeitung von Verzeichnissen mit der Klasse "dir"
Mit den Methoden der Klasse "dir" lassen sich elegantere Lösungen schreiben als mit dem Dateihandle. Das Objekt der Klasse muss dabei nicht mit "new" instanziiert werden, stattdessen wird das bei der Zuweisung selbst erledigt.
$folder = dir("/");
|
Danach kann auf zwei Eigenschaften zugegriffen werden.
- Die Eigenschaft "$folder->handle" liefert ein Handle zurück, mit dem die übrigen Funktionen ausserhalb der Klasse angesprochen werden können.
- Die Eigenschaft "$folder->path" liefert den vollständigen Pfad, der das Verzeichnis klassifiziert.
$folder->handle
$folder->path
|
Mit den Methoden "read", "rewind" und "close" können die Verzeichniselemente abgerufen werden. An dieser Stelle werden Dateien und Verzeichnisse nicht unterschieden. Die nachfolgend gezeigte Musteranwendung zeigt, wie damit umgegangen wird. Die Methode "$folder->read()" liest den nächsten Eintrag im Verzeichnis und gibt ihn als Zeichenkette zurück. Gibt es keinen Eintrag mehr, so wird "FALSE" zurückgegeben. Einen Namen und nicht ein Handle erwartende Dateifunktionen können diesen Wert direkt lesen.
$eintrag = $folder->read();
echo $eintrag;
echo filesize($entry);
|
Die Methode "$folder->rewind()" setzt den Zeiger wieder an den Anfang zurück (nicht zu verwechseln mit der Funktion "rewinddir"!).
Die Methode "$folder->close()" schliesst das Verzeichnis. Das Schliessen sollte nicht vergessen werden, da offene Verzeichnisse Systemressourcen verbrauchen. Das Öffnen erfolgt implizit mit dem Anlegen des Objekts.
Anwendungsbeispiel
Der Umgang mit Verzeichnissen ist nicht ganz einfach, wenn die vorhandenen Funktionen direkt angewendet werden. Beispielsweise fehlt eine Funktion, die den Inhalt eines Verzeichnisses in ein Array überführt, was eine bequemere Form der Weiterverarbeitung erlauben würde. Das folgende Beispiel zeigt eine solche Funktion und verwendet sie, um eine Struktur auf einem Laufwerk rekursiv anzuzeigen.
<?php
function DirToArray($sPath)
{
global $depth;
$handle = opendir($sPath);
## Lesen eines Verzeichnisses (ohne Unterverzeichnisse)
while ($arrDir[] = readdir($handle)) {}
closedir($handle);
## Anwenden aller Sortierfunktionen auf das Array "$arrDir"
sort($arrDir);
## Lesen des Arrays
foreach($arrDir as $file)
{
if (!preg_match("/^\.{1,2}/", $file) and strlen($file))
{
if (is_dir($sPath . "/" . $file))
{
echo str_repeat("-", $depth);
echo "+ <$file>";
## Das Skript nutzt die Technik der Rekursion, um beliebige
## Verzeichnisstrukturen zu lesen. In der globalen Variable "$depth"
## wird die Verschachtelungstiefe mitgeführt.
$depth++;
DirToArray($sPath . "/" . $file);
$depth--;
}
else
{
echo str_repeat("-", $depth);
echo " $file";
}
echo "<br />\n";
}
}
return $arrDir;
}
$depth = 1;
$path = "/usr"; ## Startpunkt
echo "<h3>Ausgabe eines Verzeichnisbaumes</h3>";
echo "<pre>";
$arrDir = DirToArray($path);
echo "</pre>";
?>
|
<html> Ausgabe eines Verzeichnisbaumes-+ <X11R6> --+ <bin> --- 7zr --- 822-date --- ControlPanel --- GET --- HEAD --- POST --- X ---+ <X11> ---- 7zr ---- 822-date ---- ControlPanel ---- GET ---- HEAD ---- POST ---- X ----+ <X11> ----- 7zr ----- 822-date ----- ControlPanel ----- GET ----- HEAD ----- POST ----- X -----+ <X11> ------ 7zr ------ 822-date ------ ControlPanel ------ GET ------ HEAD ------ POST ... </html> |