[PHP] Verzeichnis handling

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hi,

PHP:
<?php
   /**
   ab PHP 4.0.3, wegen: Funktion: - pathinfo();
   **/
   $MainArray = array( "MainDir"      => "/Bsp");

   $handle = @opendir($MainArray['MainDir']);
    $i = 1;
    while(false !== ($file = @readdir($handle))) {
      $InfoStrFile = pathinfo($file);
       echo $file . "<br/>";
     $i++;
    }
   closedir($handle);
?>

Mit diesem Skript kann man sich den Inhalt eines Verzeichnisses ausgeben lassen. Mit einigen Modifikationen kann man daraus sogar einen Dateibrowser erstellen.

DOCH: Was mache ich (muss ich zum Skript hinzufügen oder entfernen), wenn ich mir die Ordner bzw. Unterordner vom "Root" - Verzeichnis anzeigen lassen möchte, also alle Ordner die sich unterhalb des Ordners "/Bsp" befinden. Praktisch wie im Windows-Explorer.

Ich bin dankbar für jede Art von Hilfe, auch für Denkanstöße!
CPU
 
Nein, dass ist mir schon klar. Aber wie mache ich es, dass ALLE Ordner und Unterordner angezeigt werden?
Ich verstehe nicht welche While-Schleife ich einbauen muss!

CPU :(
 
Das lässt sich rekursiv lösen. Du packst das Ganze in eine Funktion mit einem Pfad als Parameter und einem Ergebnis-Array als Rückgabe. Dann rufst du innerhalb der Schleife noch für jedes gefundene Verzeichnis die Funktion selbst auf und fügst die Ergebnisse zum Array hinzu (z.B. mit array_merge())...
 
Moment mal ....

also ich schreibe eine Funktion. In dieser Funktion befindet sich eine Schleife, die alle Ordner ausgibt.
Doch wie geht es nun weiter? ich kann ja jetzt nicht noch zwei Schleifen einbauen, für zwei Unterordner. Ich weiss ja nicht wie viele Unterordner ich habe!

Wie bekomme ich das mit den Unterordnern hin?

CPU:eek:
 
dann lass ihn das solange machen bis er keien utnerordner mehr findet is doch logisch
 
dann lass ihn das solange machen bis er keien utnerordner mehr findet is doch logisch

genau das ist der Punkt! Cih weiß nicht, wie ich das hinbekomme, dass PHP automatisch alle Ordner und Unterordner durchsucht, egal wie viele!

Heir noch mal Code:
PHP:
<?php
   /**
   ab PHP 4.0.3, wegen: Funktion: - pathinfo();
    Ausgabe bei Mir:

<b>sampleDir - /Server_HTDOCS/dfb/sampleDir/</b><br/>
&nbsp;&nbsp;&nbsp;&nbsp;sample1 - /Server_HTDOCS/dfb/sampleDir/sample1/<br/>
&nbsp;&nbsp;&nbsp;&nbsp;sample2 - /Server_HTDOCS/dfb/sampleDir/sample2/<br/>
&nbsp;&nbsp;&nbsp;&nbsp;_pics - /Server_HTDOCS/dfb/sampleDir/_pics/<br/>
<b>_icons - /Server_HTDOCS/dfb/_icons/</b><br/>/

**/

   $MainArray = array( "MainDir"      => "/Server_HTDOCS/dfb/" );
   $handle = @opendir($MainArray['MainDir']);
    $i = 1;
    while(false !== ($file = @readdir($handle))) {
      $InfoStrFile = pathinfo($file);
     if($InfoStrFile['extension'] == "" && $file != ".." && $file != ".") {

      echo "<b>" . $file . " - " . $MainArray['MainDir'] . $file . "/</b><br/>";

      $handlea = @opendir($MainArray['MainDir'] . $file . "/");
         while(false !== ($filea = @readdir($handlea))) {
          $InfoStrFile = pathinfo($filea);
           if($InfoStrFile['extension'] == "" && $filea != ".." && $filea != ".") {

           echo "&nbsp;&nbsp;&nbsp;&nbsp;" . $filea . " - " . $MainArray['MainDir'] . $file . "/" . $filea . "/<br/>";

           }

         }

     }
     $i++;
    }
   closedir($handle);
?>

Dieser Code geht ja schon in die richtige Richtung. Doch wie bekommen ich einen "Pauschalen" Code hin, der alle Ordner und Unterordner ausließt.
Bei meinem Codestück hier ließt PHP ja nur die Erste Unterordnerebene aus!

Hilfe!!!!!!!!!1 :freak:
 
Ja die Rekursion ist nicht einfach am Anfang.


PHP:
$startVerzeichnis = "/";

$dirList = dirToString($startVerzeichnis);

function dirToString($currDir) {
	$handle = @opendir($currDir);
	$items = "";
	while(false !== ($file = @readdir($handle))) { 
		if($file != ".." && $file != ".") {
			continue;
		}
		if(is_dir($file)) {
			$items .= dirToString($currDir); // <- der trick der rekursion
		} else {
			$items .= $file . "<br>";
		}
	}
	return $items;
}

echo $dirList;

Ist NICHT geprüft, sollte aber gehen, aber zumindest mal zeigen was eine Rekursion ist :)
Im Endeffekt arbeitet die Funktion so lange bis kein Unterordner mehr gefunden wird.
Du musst das jetzt nur noch sortieren, etc ...
 
Zuletzt bearbeitet:
Oh, vielen Dank.

Du (TheNoxier) hast ja ein ähnliches Skript, wie ich es mir vorgestellt habe. Nachdem das Wort Rekursion gefallen war ist mir alles klar geworden!

So konnte ich endlich weiterarbeiten. Letzte Nacht habe ich mir dann die Stunden um die Ohre gehauen und versucht eine Lösung für mein (Haupt-)Problem zu finden (circa 20 - 3 Uhr :rolleyes: ).
Jedoch erschwert mir diese Schreibweise dir Lösungssuche (meines angestrebten Ergebnisses).

Nachher sollte PHP folgenden Code ausgeben - natürlich mit den richtigen (rellen) Ordneren-:
HTML:
<ul>
 <li>Wurzelverzeichnis

  <ul>
   <li>1. Unterordner (Name)

    <ul>
     <li>1. Unterordner des Unterordners (Name)</li>
    </ul>

   </li>
  </ul>

 </li>
</ul>

So, dass ich eine Liste habe. Und je tiefer der Ordner liegt, desto weiter ist der Punkt eingerückt! Doch tue ich mir dabei schwer.
Das erste Problem konnte ich ja noch lösen: den Teil des Pfades vor dem Ordner löschen (Also aus "/htdocs/www/src/wurzel/sample1" wurde "wurzel/sample1").
Doch dann kam ich nicht mehr weiter. Wie solle ich denn das "<li>"-Objekt offen lassen und einen neuen Unterordner einfügen und dann das ganze wieder schließen?

Ich glaube, dass ist mein bislang größtes Problem in PHP!
CPU
 
Zuletzt bearbeitet:
Den Code von TheNoxier anzupassen, wäre echt nicht schwierig gewesen. Hier aber meine knappe 3min-Lösung:

PHP:
function getDirList($path) {
 $dp=@opendir($path);
 while($entry=@readdir($dp)) if($entry!='.' && $entry!='..' && @is_dir($path.'/'.$entry)) {
  $s_subdirs=getDirList($path.'/'.$entry);
  $s_return.='<li>'.$entry.(trim(strip_tags($s_subdirs))!=''?$s_subdirs:'').'</li>';
 }
 @closedir($dp);
 return "<ul>$s_return</ul>";
}

print getDirList('.');

Hochladen, fertig.
 
Zurück
Oben