PHP/Umgang mit Verzeichnissen

Aus Mikiwiki
< PHP
Wechseln zu: Navigation, Suche

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 "+ &lt;$file&gt;";
        ## 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>