Silja Habenicht: Verzeichnisse und Unterverzeichnisse auslesen

Hi! Ich bin auf der Suche nach einem funktionsfähigem Skript, das Verzeichnisse in der Art des Explorers auslesen kann:
Die Startseite listet alle übergeordneten Verzeichnisse als Links auf, die, wenn sie angeklickt werden, zu den untergeordneten Verzeichnissen führt (eben wie beim Explorer: klickt man auf C: erscheinen die jeweiligen Unterordner z.B. WINDOWS); mit rekursivem Programmieren hab ich es schon versucht, jedoch werden dann ja alle Verzeichnisse mit ihren Unterverzeichnissen und Dateien auf einmal aufgelistet...
Für eine schnelle Antwort wäre ich wirklich dankbar, denn ich befinde mich gerade im Projekt und muß u.a. diese Aufgabe lösen.
Mit Dank im voraus und tschüß, Silja

  1. Hi! Ich bin auf der Suche nach einem funktionsfähigem Skript, das Verzeichnisse in der Art des Explorers auslesen kann:
    Die Startseite listet alle übergeordneten Verzeichnisse als Links auf, die, wenn sie angeklickt werden, zu den untergeordneten Verzeichnissen führt (eben wie beim Explorer: klickt man auf C: erscheinen die jeweiligen Unterordner z.B. WINDOWS); mit rekursivem Programmieren hab ich es schon versucht, jedoch werden dann ja alle Verzeichnisse mit ihren Unterverzeichnissen und Dateien auf einmal aufgelistet...

    Aus Deiner Beschreibung heraus würde ich jetzt sagen, daß Du einfach die Rekursion rausnehmen solltest, also einfach alle Objekte auflisten und die Verzeichnisse als Verweise auf "liste.php?verzeichnis=blabla" einrichten. Wird liste.php dementsprechend mit dem Argument verzeichnis aufgerufen, listet es statt des Startverzeichnisses halt das angegebene auf.
    Weil Du das aber ja anscheinend schon gemacht hast und mit der Rekursion nur über's Ziel hinausgeschossen bist, habe ich irgendwie das Gefühl, daß Du da selber drauf gekommen wärst/bist und insofern eine detailierte Erklärung nötig wäre :)

    Nebenbei: Vielleicht tut's ja auch die sehr konfigurierbare Standard-Verzeichnisliste des Servers, beim Apache einzuschalten mit "options +indexes" in der jeweiligen .htaccess (siehe auch http://httpd.apache.org/docs/mod/mod_autoindex.html).

    Gruß,
      soenk.e

    1. [...]Wird liste.php dementsprechend mit dem Argument verzeichnis aufgerufen, listet es statt des Startverzeichnisses halt das angegebene auf.

      Genau das habe ich auch probiert, mit und ohne Rekursion..ich schicke Dir einfach mal den Quelltext, vielleicht ist es ja nur ein kleiner Fehler... :-)

      $dir= "/data/01Jobs/fff/_aktuell/pro/dokumente/" . $folderName;
        echo "  dir: " . $dir . "<br>";
        $handle=opendir($dir);
        echo "handle: " . $handle . "<br>";
        while($datei=readdir($handle))
        {
          echo $datei . "<br>";
          if (is_dir("$dir/$datei") && $datei!="." && $datei!="..")
          {
            echo "<a href="nextTry.php?folderName=$datei">$datei</a>(dir)<br>";

      }
          else
          {
            echo "  $datei<br>";
          }
        }
        closedir($handle);

      PS: Das erste Verzeichnis wird -wie gewünscht- ausgelesen. Ebenso das zu dem jeweiligen Link führende Unterverzeichnis. Nur eine  Verzweigung in ein weiteres Unterverzeichnis ist nicht möglich. Es gibt folgende Fehlermeldung:
      Warning: OpenDir: No such file or directory (errno 2) in /data/05users/Habenicht/4.Woche/Startscripts/nextTry.php on line 6
      etc.
      ...

      1. PS: Das erste Verzeichnis wird -wie gewünscht- ausgelesen. Ebenso das zu dem jeweiligen Link führende Unterverzeichnis. Nur eine  Verzweigung in ein weiteres Unterverzeichnis ist nicht möglich. Es gibt folgende Fehlermeldung:
        Warning: OpenDir: No such file or directory (errno 2) in

        Aha, da haben wir das Problem: Die Unterverzeichnisse der zweiten Ebene erscheinen nicht mit vollem Pfad in der URL.

        /
          +--a/
          |  +--1/
          |  +--2/
          |
          +--b/
          +--c/

        Wenn Du den Inhalt von /a/1/ anzeigen willst, mußt Du auch /a/1/ angeben, damit $dir korrekterweise zu "/blabla/a/1" wird und nicht, wie momentan, zu "/blabla/1". Die erste Ebene funktioniert noch, weil /a ja tatsächlich im Wurzelverzeichnis liegt. In der Zeile

        echo "<a href="nextTry.php?folderName=$datei">$datei</a>(dir)<br>";

        fehlt also die Angabe des aktuellen Pfades:

        echo "<a href="nextTry.php?folderName=$folderName/$datei">$datei</a>(dir)<br>";

        Noch zwei Tipps:

        • Benutze doch für eine Liste <ul> und <li> statt <br>, dafür sind sie da.
        • Pass auf, daß Dir niemand Schweinereien in die URL setzt. Momentan ist es bei Dir ohne weiteres möglich, durch Einsetzen von ein paar .. in die URL den gesamten Verzeichnisbaum des Servers auszulesen, nicht nur den von Dir vorgesehenen. "nextTry.php?folderName=../../../../.." führt zum Beispiel direkt nach /data. Also: Überprüfe _grundsätzlich_ alles, was von draußen kommt!
          Und man kann ebenso wunderbar von außen HTML-, CSS- und Javascript-Code in die Seite einbauen, da Du $folderName einfach ungesichert ausspuckst. Benutze _grundsätzlich_ bei der Ausgabe von Benutzereingaben htmlentities()!. Oder besser: bei Daten allgemein, denn woher willst Du zum Beispiel wissen, daß die Verzeichnisnamen kein HTML enthalten?
          Auch wenn solcher Unfug im vorliegenden Fall nicht allzu schwerwiegend ist, es gibt genug selbstgeschrieben Gästebücher und Foren, die man mit einem entsprechenden <script>- oder <style>-Eintrag ohne weiteres (optisch) zerlegen kann.

        Gruß,
          soenk.e

        1. WOWWWW!!!! :-))))
          Du bist der Held des Tages (auch wenn das wahrscheinlich für Dich Peanuts ist!)... wir haben Tage daran gesessen, rauszubekommen, woran es liegt; wir haben uns schon gedacht,daß irgendwo ein kleiner, aber schwerwiegender Fehler im Programm sein muß...
          Es funktioniert jetzt und wir kommen zumindest einen Schritt weiter!
          Echt vielen, vielen Dank!!!
          Das mit den Sicherheitsvorkehrungen sind auch gute Tips, ich werde sie mal im Hinterkopf behalten..
          Mach's erstmal gut, und danke nochmal, tschüß
          Silja