PHP 4.3

11.3.1.2 Durch Verzeichnisse navigieren 2

Wie erläutert, verfügt das letzte Skript noch über Probleme beim Ansteuern eines höherliegenden Verzeichnisses. Es erscheint deshalb sinnvoll, darauf zu verzichten, die Zeichenkette ".." anzufügen, und stattdessen das letzte Verzeichniselement von der sich ergebenden Zeichenkette abzutrennen. Dazu benutzen wir die PHP-Funktionen substr() (Bilden eines Teilstrings) und strrpos() (liefert die Position eines gesuchten Strings relativ zum String-Ende). Sollte $new_dir anschließend einen leeren Wert besitzen, (dies trifft genau dann zu, wenn Sie aus einem Verzeichnis kommend das Root-Verzeichnis betreten), wird der Variablen der Wert " / " zugewiesen - Sie befinden sich schließlich wieder im Root-Verzeichnis.

  if ($entry == "..") {
    $new_dir = substr($current_dir, 0, strrpos($current_dir, "/"));
    if($new_dir == "") {
      $new_dir = "/";
    }
  }  

Mit dieser Änderung können wir nun den Verzeichnisbaum sauber bis zum Root-Verzeichnis zurückverfolgen. Wir ergänzen die oben abgebildete Abfrage um eine else-Bedingung und setzen dort mit einer kleinen Erweiterung die Zeichenkette $new_dir für alle übrigen Einträge zusammen.

In dieser Erweiterung muss zuerst geprüft werden, ob die Variable $current_dir den Wert " / " beinhaltet, was genau dann der Fall ist, wenn wir uns im Root-Verzeichnis befinden. Wenn dies wahr ist, wird kein zusätzlicher Schrägstrich eingefügt.

 else {
  if($current_dir == "/") {
    $new_dir = $current_dir . $entry;
  } else {
    $new_dir = $current_dir . "/" . $entry;
  }
 } 

Der Wert von $new_dir kann anschließend auf seine Eigenschaft als gültiges Verzeichnis geprüft werden und je nach Ergebnis als Link oder einfacher Eintrag dargestellt werden.

Das komplette Skript:

Beispielskript Verzeichnisnavigation
<?php
    $current_dir = $HTTP_GET_VARS["current_dir"];
    if (empty($current_dir)) {
     $current_dir = getcwd();
   }
   $dir = opendir($current_dir);
   while ($entry = readdir($dir)) {
    if($entry==".") {
      continue;
    }

    if ($entry == "..") {
      $new_dir = substr($current_dir, 0, strrpos($current_dir, "/")); 
      if ($new_dir == "") {
        $new_dir = "/";
      }
    } else {
      if($current_dir == "/") {
        $new_dir = $current_dir . $entry;
      } else {
        $new_dir = $current_dir . "/" . $entry;
      }
    }
    if(is_dir($new_dir)) {
      echo "<a href=\"" . $PHP_SELF . "?current_dir=" . urlencode($new_dir) . "\"><b>" . $entry . "</b></a><br>\n";
    } else {
      echo "<b>" . $entry . "</b><br>\n";
    }
  }
  closedir($dir);
               
?>

Kommentare (0)

Ihr Kommentar

Name