Rekursive Verzeichnisauflistung - OOP PHP Einsteigertutorial 1 Peter Kropff

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rekursive Verzeichnisauflistung - OOP PHP Einsteigertutorial 1 Peter Kropff

    Ich arbeite den Online Auftritt von Peter Kropff durch, um PHP und MySQL zu lernen.
    Nun bin ich hier:
    Tutorials - Objektorientierte Programmierung mit PHP5 - Einstiegstutorial 1 - Überlegungen

    Habe das Skript angefertigt wie im Tutorial und zur Sicherheit auch noch die Lösung heruntergeladen.
    Wenn ich allerdings den "ersten Ordner im Dateisystem" ausschließen will (also der, der bei alphabetischer Sortierung im Betriebssystem als erstes angezeigt wird), dann hängt sich das Skript immer auf, ich habe zwar eine Lösung gefunden, verstehe allerdings nicht, warum der Fehler nur dann auftritt, wenn ich den ersten Ordner ausschließe, bei allen anderen funktioniert es.

    PHP-Code:
    <?php
      error_reporting 
    (E_ALL E_NOTICE);
      class 
    Dir
      
    {
        private 
    $root;
        private 
    $filetype = array ();
        private 
    $deny     = array ();
        private 
    $files    = array ();

        
    // Festlegen des Startverzeichnisses
        
    public function setRoot ($var)
        {
          
    $this -> root $var;
        }

        
    // Festlegen der verbotenenen Ordner
        
    public function denyFolder ($var)
        {
          
    $this -> deny $var;
        }

        
    // Festlegen der erlaubten Dateitypen
        
    public function setFiletype ($var)
        {
          
    $this -> filetype $var;
        }

        
    // Suche starten, gibt im Erfolgsfall $files als Array zurück
        
    public function startSearch ()
        {
          
    $this -> doNavigate();
          if (
    $this -> files)
          {
            return 
    $this -> files;
          }
          else
          {
            return 
    false;
          }
        }

        
    // rekursive Methode zum Durchlaufen aller Ordner und Dateien
        
    private function doNavigate ()
        {
          
    // "temporäres" Array zum späteren sortieren
          
    $sort = array ();
          
    // aktuelles Verzeichnis wird geöffnet, wenn Verzeichnis vorhanden
          // und Leserechte vorhanden sind
          
    if ($handle opendir ($this -> root))
          {
            
    // Ordern und Dateien im "temopäres" Array $sort einlesen
            
    while ($found readdir ($handle))
            {
              if (
    $found != '.' && $found != '..')
              {
                
    $sort[] = $this -> root.'/'.$found;
              }
            }
            
    // Überprüfung auf Inhalte
            
    if (sizeof ($sort) > 0)
            {
              
    // alphabetisch sortieren
              
    natcasesort($sort);
              
    // Array in Schleife durchlaufen
              
    foreach ($sort as $var)
              {
                
    // Wenn Ordner
                
    if (is_dir ($var))
                {
                    
    // aktuelles Verzeichnis festlegen
                    
    $this -> setFolder ($var); // wenn der Ordner im deny Array steht, dann wird 
    // setFolder nicht ausgeführt  und doNavigate mit demselben Ordner wieder aufgerufen
                    // Rekursion, Methode ruft sich selber noch einmal auf
                    
    $this -> doNavigate();
                }
                
    // Wenn Datei
                
    else if (is_file($var))
                {
                  
    // Methode zum Schreiben der Informationen aufrufen
                  
    $this -> setFile ($var);
                }
              }
            }
            
    // Verzeichnis schließen
            
    closedir($handle);
          }
        }

        
    // Methode, um aktuelles Verzeichnis anzupassen
        
    private function setFolder ($folder)
        {
          
    // wenn Ordner erlaubt
          
    if (!$this -> checkFolder($folder))
          {
            
    // aktuelles Verzeichnis setzen
            
    $this -> root $folder;
          }
        }

        
    // Methode zur Überprüfung der erlaubten Ordner
        
    private function checkFolder ($folder)
        {
          
    //Schleife zur Überprüfung aller verbotenen Ordner
          
    foreach ($this -> deny as $forbidden)
          {
            
    // Pfad in Einzelordner zerlegen
            
    $tmp explode ('/'$folder);
            
    // Überprüfung des letzten Ordners
            
    if ($tmp[count($tmp) -1] == $forbidden)
            {
             
    // wenn verboten, true zurückgeben und abbrechen
              
    return true;
            }
          }
        }

        
    // Methode zur Erfassung der gewünschten Inhalte
        
    private function setFile ($file)
        {
          
    // Datei wird auf korrekten Typ hin überprüft
          
    if ($this -> checkFiletype($file))
          {
            
    // Dateigröße
            
    $filesize filesize ($file);
            
    // letze Änderung
            
    $filetime filemtime ($file);
            
    // Position des letzen "/"
            
    $mark strrpos ($file"/");
            
    // Pfad ohne Datei
            
    $path substr ($file0$mark);
            
    // Dateinamen ohne Pfadangabe
            
    $file substr ($file$mark 1);
            
    // Infos in $files schreiben
            
    $this -> files[] = array (
                                        
    'path' => $path,
                                        
    'file' => $file,
                                        
    'size' => $filesize,
                                        
    'time' => $filetime
                                     
    );
          }
        }

        
    // Methode zur Überprüfung der gewünschten Dateitypen
        
    private function checkFiletype ($file)
        {
          
    //Schleife zur Überprüfung aller erlaubten Dateien
          
    foreach ($this -> filetype as $valid)
          {
            
    // wenn Dateiendung paßt, true zurückgeben und abbrechen
            
    if (substr ($file, -4) == $valid)
            {
              return 
    true;
            }
          }
        }
      }

      
    // Definition aller benötigten Parameter
      
    $filetype = array ('.php','.png');
      
    $folder   = array ('bilder');
      
    $root     $_SERVER['DOCUMENT_ROOT'].'np/kurs';

      
    // Objekt vom Typ $dir erzeugen
      
    $dir = new Dir;
      
    // Startverzeichnis festlegen
      
    $dir -> setRoot ($root);
      
    // Erlaubte Ordner festlegen
      
    $dir -> denyFolder ($folder);
      
    // Erlaubte Dateitypen fetslegen
      
    $dir -> setFiletype ($filetype);
      
    // Suche beginnen
      
    $result $dir -> startSearch();
      
    // Ergebnis ausgeben
      
    echo '<pre>';
      
    print_r($result);

    ?>
    Quelle:
    http://peterkropff.de/misc/docs/PHP_..._1_Loesung.zip
    Zuletzt geändert von einermeiner; 20.07.2011, 12:07.

  • #2
    Das Script ist mittlerweile ziemlich alt. Kann sein, dass da noch ein Fehler drin ist. Auch wenn ich dein Problem im Moment nicht nachvollziehen kann. Ich überarbeite gerade die Tutorials. Wenn du willst, schick ich dir eine aktuelle Fassung der Klasse per Mail.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Wenn man bei dem alten Skript folgende Struktur hatte un den Ordner bilder ausgeschlossen hat, so hat sich das Skript in einer Endlosschleife aufgehangen, was auch Sinn macht. Wenn man jedoch einen anderen Ordner ausschließt, tritt das Problem nicht auf.

      Folgene Verzeichnisstruktur:
      htdocs
      np
      kurs
      bilder/
      bild1.png
      bild2.png
      downloads/
      datei.php
      datei2.php
      Danke für die Aktualisierung, da hast du den Fehler nämlich korrigiert und es funktioniert.

      Kommentar

      Lädt...
      X