Paul J.: Verzeichnisse auslesen

Hi!

Ich habe ein Script zum Verzeichnis auslesen im Hauptverzeichnis.
Wechsle ich nun in einen Unterordner wird dieser ausgelesen.
Will ich aber ein weiteres Unterverzeichnis auslesen gibt es keine Fehlermeldung, aber auch ausgelesen wird nicht:-(

Ich glaube es liegt an den Pfadangaben, weiß aber nicht.

Beispiel:
"." ließt Hauptverzeichnis aus
"./admin" ließt Adminverzeichnis aus
"./admin/bilder" gibt keine Fehlermeldung ließt aber auch nicht aus

Könnt ihr mir weiterhelfen?

Danke, Paul

  1. Hellihello

    Ich glaube es liegt an den Pfadangaben, weiß aber nicht.

    Beispiel:
    "." ließt Hauptverzeichnis aus
    "./admin" ließt Adminverzeichnis aus
    "./admin/bilder" gibt keine Fehlermeldung ließt aber auch nicht aus

    Könnt ihr mir weiterhelfen?

    var_dump(scan_dir("./admin/bilder"));
    ungetestet.

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
  2. Hi,

    "./admin/bilder" gibt keine Fehlermeldung ließt aber auch nicht aus

    Verzeichnisrechte entsprechend gesetzt?

    Ansonsten kannst Du es mal hiermit probieren. Das Script liest Verzeichnisse rekursiv aus und gibt entsprechend des übergebenen Modus-Params und der Suffix ein Pfad oder File-Array zurück. Ggf die Regex anpassen, wenn Filenamen nicht passen. Ist schon ein bisschen älter, aber läuft. Darfst gerne verbessern ;-)

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Hellihello

      Ansonsten kannst Du es mal hiermit probieren. Das Script liest Verzeichnisse rekursiv aus und gibt entsprechend des übergebenen Modus-Params und der Suffix ein Pfad oder File-Array zurück. Ggf die Regex anpassen, wenn Filenamen nicht passen. Ist schon ein bisschen älter, aber läuft. Darfst gerne verbessern ;-)

      Es gibt übrigens in der Standard PHP Library eine RecursiveDirectoryIterator.

      Ich habs mal so probiert:

        
      function overview ($dir) {  
      //  echo "<h3>dir: $dir</h3>\n";  
        foreach(scandir($dir) as $dir_or_file) {  
        if (strpos($dir_or_file,".")!==0) {  
         if (is_dir($dir.'/'.$dir_or_file))  {  
          echo "<li>$dir_or_file<ul>\n";  
          overview($dir.'/'.$dir_or_file);  
          echo "</ul></li>\n";  
         }  
         else {  
          if (true) { //strpos($dir_or_file,".php" ) || strpos( $dir_or_file, ".htm")) {  
           echo '<li><a href="' .$dir. "/" .$dir_or_file. '">'. $dir_or_file. '</a></li>'."\n";  
          } else  
          echo "<li>$dir_or_file</li>\n";  
         }  
        }  
       }  
      }  
      overview(".");  
        
        
      
      

      Gruesse, Joachim

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
      1. Danke, hat super funktioniert!

      2. Hello,

        Es gibt übrigens in der Standard PHP Library eine RecursiveDirectoryIterator.

        Auch Dein Script kann mit zyklischem Verlauf  icht umgehen. Es erkennt ihn nicht.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hellihello

          Es gibt übrigens in der Standard PHP Library eine RecursiveDirectoryIterator.

          Auch Dein Script kann mit zyklischem Verlauf  icht umgehen. Es erkennt ihn nicht.

          Du meinst, weder der RecursiveDirectoryIterator noch mein Script können mit zyklischem Verlauf umgehen und meinst mit "zyklischem Verlauf" was? Eine Abbruchbedingung, damit es sich nicht endlos abspult?

          Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Hello,

            Du meinst, weder der RecursiveDirectoryIterator noch mein Script können mit zyklischem Verlauf umgehen und meinst mit "zyklischem Verlauf" was? Eine Abbruchbedingung, damit es sich nicht endlos abspult?

            Ein zyklischer Verlauf, was streng genommen etwas ganz anderes ist, als Rekursion, entsteht hier dardurch, dass innerhalb der rekusiven Struktur des Dateisystems Verweise bestehen können auf höhere Ebenen, die z.B. sogar bereits durchlaufene Strukuturen enthalten können oder diese bei weiterer Abarbeitung wieder erreichen werden.

            Wenn man trotzdem die gesamte tatsächliche Struktur auswerten will, muss m,an sich merken, welche Abzweigungen (Directories) man bereits eingesammelt hat, und zwar im aufgelösten Zustand. Nur im aufgelösten Zustand (realpath()) sind die vergleichbar.

            Ich hatte auch mal, zusammen mit Dedlfix als 'Kontolleuer', ein Beispiel gebaut, dass mit Links klar kommt. Da müsstest Du einfach mal im Archiv suchen.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
      3. Hallo Robert,

        vorab: meine folgende Kritik ist nicht persönlich gemeint.

        Ich habs mal so probiert:

        und warum finde ich keinen einzigen Kommentar außer auskommentiertem Code. Unkommentierter Code ist miserabler Code. Dein Code erklärt sich - wie nahezu jeder Code - nicht von selbst.

          
        // Was ist die Aufgabe dieser Funktion?  
        // Kommentar: sie hat einen verbesserungswürdigen Namen  
        // Welche Parameter nimmt sie entgegen?  
        // Kommentar: der Name des Parameters ist ok.  
        // Was gibt sie zurück?  
        // Warum gibt sie nichts zurück?  
        // Warum gibt sie etwas aus?  
        // Warum gibt sie HTML aus?  
        // Wenn sie schon HTML ausgibt, warum ist die Ausgabe nicht kontextgemäß aufbereitet?  
          
        // Zum Coding-Style: 1 Zeichen Einrückung ist eine Zumutung!  
        
        > function overview ($dir) {  
        > //  echo "<h3>dir: $dir</h3>\n";  
          
        //  Was durchläufst Du mit dieser Schleife  
        //  $dir_or_file ist ein verbesserungswürdiger Variablenname  
        
        >   foreach(scandir($dir) as $dir_or_file) {  
          
        //  Was bezweckt diese Prüfung? Das ist nicht offensichtlich!  
        
        >   if (strpos($dir_or_file,".")!==0) {  
          
        //   Was ist der Sinn dieser Prüfung?  
        
        >    if (is_dir($dir.'/'.$dir_or_file))  {  
          
        //   Warum wird hier etwas ausgegeben?  
        
        >     echo "<li>$dir_or_file<ul>\n";  
          
        //   Warum erfolgt der rekursive Aufruf? Begründe es!  
        //   Bist Du Dir sicher, dass Du in jedem Fall absteigen musst?  
        
        >     overview($dir.'/'.$dir_or_file);  
          
        
        >     echo "</ul></li>\n";  
        >    }  
        >    else {  
        
        // Aha, welchen Fall haben wir hier. Schreibe es hin!  
          
        // Was soll das? Begründe!  
        
        >     if (true) {  
          
        //strpos($dir_or_file,".php" ) || strpos( $dir_or_file, ".htm")) {  
          
        /*  
           Kannst Du Dir vorstellen, dass es Zeichen in Dateinamen geben kann,  
           die im HTML-Kontext behandelt werden müssen. Warum machst  
           Du dies nicht?  
           Welche Spezialbedingung gilt für den Inhalt von $dir?  
          
           Anmerkung zum Coding-Style:  
           Ich halte es für eine gute Idee, Operatoren durch Leerzeichen von den  
           Operanden zu trennen. Es fällt mir schwer, Deinen Code zu lesen.  
          
           Viel sinnvoller wäre es selbstverständlich, wenn diese Funktion nichts  
           ausgäbe, stattdessen etwas zurückgäbe.  
        */  
        
        >      echo '<li><a href="' .$dir. "/" .$dir_or_file. '">'. $dir_or_file. '</a></li>'."\n";  
        >     } else  
        >     echo "<li>$dir_or_file</li>\n";  
        >    }  
        >   }  
        >  }  
        > }  
        > overview(".");  
        > 
        
        

        Fazit:
        Eine höchst spezifische Funktion, überhaupt nicht dokumentiert - und wie Tom anmerkte dazu anfällig für Endlosschleifen.

        Meine ernstgemeinte Bitte:

        Wenn man schon Code wie diesen, eine einfache Funktion vorstellt, dann sollte diese *ausreichend* und ordentlich dokumentiert sein. Dies bedeutet, dass die Aufgabe beschrieben ist und man *nicht* den Code durchackern muss, um sie zu verstehen.

        Code wie der vorgestellte ist nicht hilfreich!
        Obwohl der Fragesteller mit Deinem Code zufrieden war, bin ich der Ansicht, dass Deine Funktion nur als Beispiel dafür dient, wie man es *nicht* machen sollte.

        Konstruktive Grüße

        Vinzenz

        1. Hellihello Vinenz,

          mit allem was Du schreibst, geben ich Dir Recht!

          Es war der erste Versuch, sowas zum Laufen zu bringen und diente mir als Übersicht über die Ordner auf der Seite der HTMl-AG.

          Der Code sollte wie von Dir beschrieben refaktoriert/umgeschrieben werden, aber da er "funzte" und seinerzeit meinen Ansprüchen genügte, juckte es mich gestern, dem Fragesteller u.U. einen Anhaltspunkt zu geben. Ich hatte kein Interesse, da weiter Arbeit bzw. Zeit zu investieren.

          Vermutlich hast Du Recht, wenn Du meinst, dass man sowas dann lieber nicht posten sollte. Ich dachte halt, vielleicht entdeckt er ja daran einen Ansatz, den er übersehen hatte nach dem Motto: "mach was draus". Aber genauso kann man auch Deiner Argumentation folgen und es lieber bleiben lassen.

          Dank und Gruß,

          Robert aka

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Hellihello,

            der Erinnerung halber:

            http://forum.de.selfhtml.org/archiv/2008/8/t175998/#m1157245

            immerhin kommentiert...;

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
            1. Hallo Robert,

              der Erinnerung halber:
              http://forum.de.selfhtml.org/archiv/2008/8/t175998/#m1157245

              immerhin kommentiert...;

              ... und die Kommentare zeigen, dass Du nicht genau weißt, was Du machst!
              Lies Deinen eigenen HTML-Kommentar. Schau' Dir bitte Joachims Code an.
              Übrigens ein abschreckendes Beispiel für einen nicht angebrachten Einsatz der alternativen Syntax.

              Ich bitte Dich, Verarbeitung und Ausgabe besser zu trennen.

              Freundliche Grüße

              Vinzenz

              1. Hellihello

                ... und die Kommentare zeigen, dass Du nicht genau weißt, was Du machst!
                Lies Deinen eigenen HTML-Kommentar. Schau' Dir bitte Joachims Code an.
                Übrigens ein abschreckendes Beispiel für einen nicht angebrachten Einsatz der alternativen Syntax.

                Jau, deshalb folgte ja der DOM-Versuch.

                Ich bitte Dich, Verarbeitung und Ausgabe besser zu trennen.

                Was im DOM-Versuch ja gegeben wäre, oder?

                Dank und Gruß,

                frankx

                --
                tryin to multitain  - Globus = Planet != Welt
                1. Hallo,

                  Ich bitte Dich, Verarbeitung und Ausgabe besser zu trennen.
                  Was im DOM-Versuch ja gegeben wäre, oder?

                  Ist es wirklich gegeben? Sagen wir so: nicht die DOM-Funktionen, sondern die Iteratoren nehmen Dir die Verarbeitung, die Du in Deiner Funktion "overview" hattest, ab. Du kannst Dich in einer einfachen foreach-Schleife durch jedes Element des Verzeichnisbaumes hangeln. Ja, der Code gewänne durch die Iteratoren an Eleganz *und* Aussagkraft, wenn Du entsprechende Bezeichner wähltest - und den Code angemessener kommentiertest. Ein paar Berichtigungen habe ich bereits eingearbeitet, eine viel größere Liste an (zum Teil rhetorischen) Fragen hinzugefügt, die Dir als Anregung für sinnvollere Kommentierung dienen können.

                    
                    // set Directory to recursively iterate through  
                    // $startDirectory? Nein, $dir_path ist nicht gut gewählt.  
                    $dir_path = "it_test";  
                    
                    // create instance of RecursiveDirectoryIterator predefined SPL-class  
                    // ist das wirklich ein guter Variablenname?  
                    $my_recursive_dir_reader_iterator = new RecursiveDirectoryIterator($dir_path);  
                    
                    // create instance of RecursiveIteratorIterator passing over the recursive DirectoryIterator  
                    // $dir_or_file_path ist schrecklich umständlich, warum nicht einfach $element?  
                    $dir_or_file_path = new RecursiveIteratorIterator($my_recursive_dir_reader_iterator, true)  
                    
                    // create a nested unordered list using DOM-functions  
                    $dom = new [link:http://www.php.net/manual/de/class.domdocument.php@title=DOMDocument];  
                    // You like it nice indentation?  
                    // Me too!  
                    $dom->formatOutput = true;  
                    // Tipp: Bitte sei konsistent bei Deinen Bezeichnern. Warum nicht komplett camelCase?  
                    // master ul element scheint mir auch optimierbar (rootList ?)  
                    $master_ul_element = $dom->createElement("ul");  
                    $dom->appendChild($master_ul_element);  
                    
                    // iterate recursive through the object  
                    // Welches Objekt?  
                    // Durchlaufe den Verzeichnisbaum.  Die Iteratoren ermöglichen die Traversierung des gesamten Baumes  
                    // ohne dass wir uns selbst um die Rekursion kümmern müssen. Da spielen rekursive Iteratoren ihre Stärke aus!  
                    // Statt $file böte sich $path an  
                    foreach ( $dir_or_file_path as $file ) {  
                        // create li-Element with text  
                        // Was für Text? Genau sowas ist *kein* guter Kommentar  
                        $li = $dom->createElement("li");  
                        // Text wäre somit die aktuelle Verschachtelungstiefe und der Pfad.  
                        // Warum sagst Du nicht genau das, sondern einfach nur "text"?  
                        $text = "depth: " . $dir_or_file_path->getDepth() . " - name: " . $file;  
                        $textElement = $dom->createTextNode($text);  
                        $li->appendChild($textElement);  
                    
                        // check if on top level, then append to master-ul-element  
                        // Wir befinden uns im Startverzeichnis, hänge das Listenelement  
                        // mit dem Pfad des aktuellen Elementes in die äußere Liste  
                        if ($dir_or_file_path->getDepth() == 0) {  
                            $master_ul_element->appendChild($li);  
                        }  
                        else {  
                            // if not, append to the one above  
                            // Was ist "one above"?  
                            // ein weiterer verbesserungswürdiger Variablenname  
                            $sub_ul_element[$dir_or_file_path->getDepth()-1]->appendChild($li);  
                        }  
                    
                        // Nutze Leerzeilen auf sinnvolle Weise, um den Code zu strukturieren  
                        // if iteration-element has children, create an sub-ul-element  
                        // which iteration element? current? next? last?  
                        // Übersetzt: Es handelt sich um ein (nicht leeres?) Verzeichnis!  
                        // Warum schreibst Du nicht das, sondern etwas völlig abstraktes?  
                        if ($dir_or_file_path->hasChildren()) {  
                            $sub_ul_element[$dir_or_file_path->getDepth()] = $dom->createElement("ul");  
                            $li->appendChild($sub_ul_element[$dir_or_file_path->getDepth()]);  
                        }  
                    }  
                    
                    // some output  
                    // Gib nicht so viel aus, gib lieber etwas zurück :-)  
                    echo $dom->saveXML();  
                  
                  

                  Warum wird das nicht in eine ordentlich benannte Funktion (oder Methode) gepackt? Warum fliegt hier Code irgendwie in der Gegend herum?

                  Freundliche Grüße

                  Vinzenz

                  1. Hellihello

                    Warum wird das nicht in eine ordentlich benannte Funktion (oder Methode) gepackt? Warum fliegt hier Code irgendwie in der Gegend herum?

                    Historisch bedingt (Testlaborstadium):

                      
                    <?php  
                    // read recursively through directory using SPL-Iterators and Dom Functions  
                    class RecursiveDirectoryReader  
                    {  
                       // directory to recursively iterate through  
                       private $_baseDirPath = "";  
                      
                       // instance of RecursiveDirectoryIterator predefined SPL-class  
                       private $_recursiveDirectoryIterator = NULL;  
                      
                       // instance of RecursiveIteratorIterator passing over the recursive DirectoryIterator  
                       private $_recursiveIteratorIterator = NULL;  
                      
                       // instanciate RecursiveDirectoryIterator and RecursiveIteratorIterator  
                       public function __construct($basePath = ".")  
                       {  
                          // check if passed param is existing directory path  
                          if (!is_dir($basePath)) {  
                             return false;  
                          }  
                      
                          $this->_baseDirPath = $basePath;  
                      
                        // instance of RecursiveDirectoryIterator predefined SPL-class  
                          $this->_recursiveDirectoryIterator = new RecursiveDirectoryIterator($basePath);  
                      
                          // instance of RecursiveIteratorIterator passing over the recursive DirectoryIterator  
                          $this->_recursiveIteratorIterator = new RecursiveIteratorIterator($this->_recursiveDirectoryIterator, true);  
                      
                          return $this;  
                       }  
                      
                       // return a nested unordered list using DOM-functions  
                       public function getNestedList()  
                       {  
                          // return if no iterators set  
                          if (NULL === $this->_recursiveDirectoryIterator ||  
                             NULL === $this->_recursiveIteratorIterator) {  
                             return false;  
                          }  
                      
                          $dom = new DOMDocument ("1.0");  
                          // You like it nice indentation? Me too!  
                          $dom->formatOutput = true;  
                      
                          // Tipp: Bitte sei konsistent bei Deinen Bezeichnern. Warum nicht komplett camelCase?  
                          $baseUl = $dom->createElement("ul");  
                          $dom->appendChild($baseUl);  
                      
                          // iterate recursive through the instance of RecursiveIteratorIterator  
                          // Durchlaufe den Verzeichnisbaum.  Die Iteratoren ermöglichen die Traversierung des gesamten Baumes  
                          // ohne dass wir uns selbst um die Rekursion kümmern müssen. Da spielen rekursive Iteratoren ihre Stärke aus!  
                          // $path seems to be a dummy and not needed to be able to use "foreach"  
                          foreach ( $this->_recursiveIteratorIterator as $path ) {  
                      
                             // create list entry  
                             $li = $dom->createElement("li");  
                      
                             // Ausgabetext, aktuelle Verschachtelungstiefe und Pfad.  
                             $depthAndPathInfo = "depth: " . $this->_recursiveIteratorIterator->getDepth() .  
                                                        " - name: " . htmlentities ($path);  
                             $li->appendChild( $dom->createTextNode($depthAndPathInfo) );  
                      
                             // check if on top level, then append to master-ul-element  
                             // Wir befinden uns im Startverzeichnis, hänge das Listenelement  
                             // mit dem Pfad des aktuellen Elementes in die äußere Liste  
                             if ( $this->_recursiveIteratorIterator->getDepth() == 0 ) {  
                                $baseUl->appendChild($li);  
                             } else {  
                              // if not on top level, append to the parent ul-element  
                        $nestedUl[$this->_recursiveIteratorIterator->getDepth()-1]->appendChild($li);  
                             }  
                      
                             // if currtent iteration-element is a directory, create an nested ul-element  
                             if ($this->_recursiveIteratorIterator->hasChildren()) {  
                                $nestedUl[$this->_recursiveIteratorIterator->getDepth()] = $dom->createElement("ul");  
                                $li->appendChild($nestedUl[$this->_recursiveIteratorIterator->getDepth()]);  
                             }  
                          }  
                          return $dom->saveXML();  
                       }  
                    }  
                    // test  
                    $myRecursiveDirReader = new RecursiveDirectoryReader(".");  
                    echo $myRecursiveDirReader->getNestedList();
                    

                    Dank und Gruß,

                    frankx

                    --
                    tryin to multitain  - Globus = Planet != Welt
          2. Hallo,

            mit allem was Du schreibst, geben ich Dir Recht!

            Der Code sollte wie von Dir beschrieben refaktoriert/umgeschrieben werden, aber da er "funzte" und seinerzeit meinen Ansprüchen genügte, juckte es mich gestern, dem Fragesteller u.U. einen Anhaltspunkt zu geben. Ich hatte kein Interesse, da weiter Arbeit bzw. Zeit zu investieren.

            Du kennst das Archiv? ;-)

            Vermutlich hast Du Recht, wenn Du meinst, dass man sowas dann lieber nicht posten sollte.

            Wo ist das Problem, sich die Zeit zu nehmen, nach dem Einkopieren des Codes diesen wenigstens rudimentär zu kommentieren?

            Ich dachte halt, vielleicht entdeckt er ja daran einen Ansatz, den er übersehen hatte nach dem Motto: "mach was draus".

            Gerade Anfänger können aus völlig unkommentiertem Code *keinen* Ansatz entdecken. Sie nehmen den Code und schlecht ist.

            Aber genauso kann man auch Deiner Argumentation folgen und es lieber bleiben lassen.

            Du weißt, dass ich nicht zur Fraktion gehöre, die fertigen Code verteufelt. Ich wünsche mir kommentierten Code, der dem Leser aufzeigt, warum es so gemacht wurde wie es gemacht wurde.

            Ich möchte hier an die wunderbaren Diskussionen um "gleichverteilte Zufallszahlen" erinnern, die zu gleichnamigen Artikel führte. Ich fand's sehr lehrreich - auch wenn der Code dort selten kommentiert war. Die Algorithmen wurden dafür im Text ausführlich besprochen. Dies fehlte Deinem Posting komplett. Eben die dort erwähnte Methode:

            "Ich hab' da was im Internet gefunden, was prima funzt ..."

            Ich wünsche mir bessere Code-Qualität. Damit Anfänger Code-Fragmente oder Funktionen verstehen - und die Anwendung bestimmter Sprachkonstrukte verstehen, bedarf es zusätzlicher Erläuterungen (ähnlich wie in Tutorials), die in Kommentaren von Produktivcode nichts verloren haben. Sowas wünsche ich mir und ich versuche, es selbst so gut wie möglich zu praktizieren.

            Freundliche Grüße

            Vinzenz

        2. Hallo Ingrid,

          eine Korrektur:

          Kannst Du Dir vorstellen, dass es Zeichen in Dateinamen geben kann, die in einem HTML-Kontext oder einem URL-Kontext innerhalb eines HTML-Kontextes auftreten, kontextgemäß behandelt werden müssen. Warum machst Du dies nicht?

          echo '<li><a href="' .$dir. "/" .$dir_or_file. '">'. $dir_or_file. '</a></li>'."\n";

          Freundliche Grüße

          Vinzenz

    2. Hello,

      Ansonsten kannst Du es mal hiermit probieren.

      Das Script ist noch nicht fertig.
      Es fängt keine zyklischen Verläufe ab.
      Wenn ein Link auf ein Verzeichnis in eine höhere Ebene zurückverweist, wird sich das Script aufhängen.

      Um dies abzufangen, ist realpath() in Verbindung mit einem Array der zu lesenden Verzeichnisse geeignet.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        Wenn ein Link auf ein Verzeichnis in eine höhere Ebene zurückverweist, wird sich das Script aufhängen.

        Kannst Du mir das genauer erklären? Symlinks werden ja durch die Abfrage:
        if (is_dir($path . "/" . $file)) {
        in den else-Zweig geschickt (wo sie aufgrund der Regex ignoriert werden), und "./" oder "../" werden sowieso ignoriert...

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Hello,

          Wenn ein Link auf ein Verzeichnis in eine höhere Ebene zurückverweist, wird sich das Script aufhängen.
          Kannst Du mir das genauer erklären? Symlinks werden ja durch die Abfrage:
          if (is_dir($path . "/" . $file)) {
          in den else-Zweig geschickt (wo sie aufgrund der Regex ignoriert werden), und "./" oder "../" werden sowieso ignoriert...

          Hast Du das auch überprüft?

          Meine Erfahrung: Erst wird aufgelöst, dann wird mit is_dir() geprüft.

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi Tom,

            Hast Du das auch überprüft?

            ja, habe ich eben extra angelegt, Testausgaben gemacht etc. Der Symlink lief in den else-Zweig... arbeitet is_dir am Ende besser als Du erwartet hast, oder liegts am PHP5?

            Gruesse, Joachim

            --
            Am Ende wird alles gut.
            1. Hello Joachim,

              Hast Du das auch überprüft?
              ja, habe ich eben extra angelegt, Testausgaben gemacht etc. Der Symlink lief in den else-Zweig... arbeitet is_dir am Ende besser als Du erwartet hast, oder liegts am PHP5?

              Ich habe nun extra nochmal ein Testscript erstellt uaf dem neu installierten Test-Host:

              Anfangsbedingungen:

              debian4:/var/www# tree
              .
              |-- index.html
              |-- index.php
              `-- index.php~

              0 directories, 3 files

              Ausführen des Scriptes:

              <?php   ### is_link.php ###

              echo "<pre>\r\n";

              Aktuelles Verzeichnis ausgeben

              echo "Working Directory: ".getcwd()."\r\n";

              Zur Kontrolle, ob is_dir() richtig arbeitet:

              Ist das aktuelle Verzeichnis ein Directory?

              echo "Directory?: ".(is_dir(getcwd())?'Dir':'no-Dir')."\r\n";

              ein neues Verzeichnis anlegen

              echo (mkdir (getcwd()."/dirtest", 0777)?"Verzeichnis angelegt":"Fehler beim Anlegen des Verzeichnis")."\r\n";

              echo "Directory-2?: ".(is_dir(getcwd()."/dirtest")?'Dir':'no-Dir')."\r\n";

              echo (symlink (getcwd()."/dirtest","meinlink")?'Link erstellt':'Fehler beim Linken')."\r\n";

              echo "Directory-2?: ".(("meinlink")?'Dir':'no-Dir')."\r\n";

              echo "</pre>\r\n";

              ?>

              Ausgabe des Scriptes:

              Working Directory: /var/www
              Directory?: Dir
              Verzeichnis angelegt
              Directory-2?: Dir
              Link erstellt
              Directory-2?: Dir

              und das Listing:

              debian4:/var/www# ls -la
              insgesamt 24
              drwxrwxr-x  3 root     www-data 4096 2008-11-16 10:33 .
              drwxr-xr-x 15 root     root     4096 2008-11-04 17:27 ..
              drwxr-xr-x  2 www-data www-data 4096 2008-11-16 10:33 dirtest
              -rw-rw-r--  1 root     www-data   45 2008-11-04 17:27 index.html
              -rw-rw-r--  1 root     www-data  516 2008-11-16 10:32 index.php
              -rw-rw-r--  1 root     www-data  441 2008-11-16 10:25 index.php~
              lrwxrwxrwx  1 www-data www-data   16 2008-11-16 10:33 meinlink -> /var/www/dirtest
              debian4:/var/www#

              Also entweder reden wir aneinander vorbei, was man ja berichtigigen könnte ;-) oder aber einer der Tests ist falsch.

              Mir dünkt, dass Du das Ganze auf eine WinDOSe gemacht haben könntest. Es könnte sein, dass das dort nicht so funktioniert. Das darf aber nun mal jemand anderes ausprobieren. Der Xampp hat bei mir noch Urlaub.

              Liebe Grüße aus Syburg bei Dortmund

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hello Joachim,

                Zur Sicherheit auch noch eine Gegenkontrolle:

                echo "PWD ein Directory?: ".(is_dir(getcwd())?'Dir':'no-Dir')."\r\n";
                echo "Index ein Directory?: ".(is_dir(__FILE__)?'Dir':'no-Dir')."\r\n";

                liefert an der Stelle

                PWD ein Directory?: Dir
                Index ein Directory?: no-Dir

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Lieber Tom,

                  ich gestehe, ich habe gestern offenbar Sch*** gebaut, denn der Symlink war wohl nicht sauber. Da Du Dir so viel Mühe gemacht musste ich das jedenfalls nochmal testen, obwohl die Familie auf die gestürzte Apfeltarte wartet.

                  Fazit: Ich habe einen Vergleich mit realpath eingebaut (erst mal auf die Schnelle, ich weiss nicht obs so optimal ist), der Symlinks ausschliesst:
                  Html Ansicht des Scriptes
                  Script im Einsatz mit Testausgaben

                  Danke, und grüss den Berg von mir,
                  Joachim

                  --
                  Am Ende wird alles gut.
                  1. Hello Joachim,

                    Fazit: Ich habe einen Vergleich mit realpath eingebaut (erst mal auf die Schnelle, ich weiss nicht obs so optimal ist), der Symlinks ausschliesst:

                    Das kann man auch mit einer Kombination von is_link() und is_dir() erreichen.
                    Gefährlich sind ja nur die Verzeichnislinks. Bei Datei-Links sehe ich keinerlei Gefahr.

                    Wenn man dann aber die per Link eingeschlossenen Verzeichnisse nicht unterschlagen will, kann man die Verzeichnisse einfach erst mit realpath() auflösen, in einem Array sammeln, und so Doubletten vermeiden. Wenn der Verzeischnissuchlauf dann fertig ist, fängt man an, die Dateien einzusammeln.

                    Beispiel
                    http://forum.de.selfhtml.org/archiv/2007/12/t163759/#m1066568
                    mit Kommentaren von Dedlfix

                    Lass Dir die Torte schmecken :-)
                    Der Berg muss noch bis Januar warten.

                    Liebe Grüße aus Syburg bei Dortmund

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hi Tom,

                      Gefährlich sind ja nur die Verzeichnislinks. Bei Datei-Links sehe ich keinerlei Gefahr.

                      Ich hab das Script für definierte Galerie- oder Flatfile-Verzeichnisse genutzt, das war eh unproblematisch. Insofern langt es mir momentan, lediglich eine Endlosschleife zu unterbinden...

                      Beispiel
                      http://forum.de.selfhtml.org/archiv/2007/12/t163759/#m1066568

                      Auf jeden Fall mal in Ruhe durchgehen...

                      Lass Dir die Torte schmecken :-)

                      die Tarte! Und zwar gestürzt! Du weisst schon: Zucker karamelisieren, Äpfel rein, Teig obendrauf, ab in den Ofen und am Schluss stürzen!

                      Der Berg muss noch bis Januar warten.

                      Armer Exilant...

                      Gruesse, Joachim

                      --
                      Am Ende wird alles gut.
    3. Hello,

      Ansonsten kannst Du es mal hiermit probieren.

      Hab noch was vergessen: Beim Verzeichnis oder File mit Namen '0' bricht das Script ab.
      Der Vergleich auf Treffer oder Ende des Lesevorganges von readdir() ist falsch.
      Schau nochmal ins Handbuch.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        Schau nochmal ins Handbuch.

        Das Script stammt noch aus der PHP3 Zeit, da gabs diese Hinweise im Handbuch noch nicht ;-)

        Aber Verbesserungen sind immer willkommen...

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
    4. Hallo,

      Ansonsten kannst Du es mal hiermit probieren.

      Schöner Code.

      Bitte in den Kommentaren die weiteren Statuscodes dokumentieren (wird bei Erweiterungen gern vergessen). Wie wäre es mit Umschreiben auf PHP5-OOP? Benötigst Du die PHP4-Kompatibilität (Konstruktor) noch?

      Freundliche Grüße

      Vinzenz

      1. Hi,

        Schöner Code.

        :-)

        Bitte in den Kommentaren die weiteren Statuscodes dokumentieren (wird bei Erweiterungen gern vergessen).

        Das stimmt, vor allem, wenn man nur selber damit herumdaddelt. Werd ich bei Gelegenheit mal nachholen.

        Wie wäre es mit Umschreiben auf PHP5-OOP? Benötigst Du die PHP4-Kompatibilität (Konstruktor) noch?

        Das muss ich überprüfen, nutze das Script noch bei unterschiedlichen Hostern...

        Gruesse, Joachim

        --
        Am Ende wird alles gut.