Geschrieben von arve am 07.01.2006, 14:39

Tutorial | Verzeichnisstruktur
von Arve (arve.lima-city.de)

➦ Die Einführung
Vor allem bei größeren Projekten hat der Administrator nicht immer den Überblick über alle Dateien, die sich momentan auf dem Server befinden. Um dem entgegenzuwirken habe ich ein kleines Tutorial geschrieben in dem ALLE VERZEICHNISSE UND DATEIEN, die sich auf dem Server befinden, angezeigt werden.

➥ Das Ziel
Das Ziel ist die Erstellung eines, nach dem Alphabet sortierten, Verzeichnisbaumes, der alle Unterverzeichnisse und Dateien beinhaltet.

➤ Zusatz
- Icons für die jeweilige Dateiendung sollten selbst erstellt werden.
- Die Icons leer.gif und folder.gif können per PN angefortert werden.

Zu beginn haben wir ein Verzeichnis, das Ordner und Dateien enthält, die aufgelistet werden sollen. Das Verzeichnis nennen wir $path . Um den Inhalt des aktuellen Ordners auszulesen setzen wir dafür den String "./" .

Um die Dateien zu zählen nehmen wir die Globalen Variable $_SERVER. Der Startwert soll 0 sein. Im weiteren Verlauf werden diese durch $_SERVER[dirs]++; bzw. $_SERVER[files]++; um den Wert 1 erhöht.
$_SERVER[dirs]=0;
$_SERVER[files]=0;

Nun wollen wir alle Dateien und Verzeichnisse auslesen. Dazu brauchen wir eine Funktion, denn wenn ein Ordner geöffnet wird, so müssen wir aus diesem wiederum die Dateien auslesen - und wir kennen die Anzahl der Ordner nicht!
Die Funktion nenne ich dann mal getfiles(). Als "Input" braucht diese Funktion natürlich den Pfad. Alle Dateien sollen in ein Array geschrieben werden. Dafür setzen wir am Anfang den Typ der Variable $array mittels array() auf Array. Um am Ende der Funktion auch ein Ergebnis zu erhalten müssen wir nun noch return $array; hinzufügen. Das "Grundgerüst" steht:
function getfiles($pfad)
{
$array = array();
return $array;
}

Mittels opendir(); öffnen wir das Verzeichnis $path und lassen alle Dateien und Ordner in einer While-Schleife auslesen. Am Ende wird das Verzeichnis wieder geschlossen. Da "./" und "../" auch als Verzeichnis ausgelesen werden und diese "Verzeichnisse" nicht relevant sind, müssen wir diese durch eine einfache if-Schleife überspringen.
$open = opendir($pfad);
while ($file = readdir($open))
{
if($file=='.' OR $file ==".."){continue;}
# [...]
}
closedir($open);

Da auch Unterordner wiederum geöffnet werden sollen müssen wir zwischen Ordnern und Dateien unterscheiden. Außerdem ist der absolute Pfad beim Öffnen eines Verzeichnisses erforderlich.
$pfad_absolut = $pfad."/".$file;
Wenn $file (ausgelesen durch opendir() ) eine Datei ist, so soll diese dem Array $array hinzugefügt werden. Ist $file jedoch ein Verzeichnis (Kontrolle durch is_dir() ) so soll die eigene Funktion wieder aufgerufen werden, um dem Array ($array) auch alle Dateien und Unterordner hinzuzufügen.
Um die Ausgabe auch übersichtlich nach dem Alphabet zu erhalten nutze ich die Funktion asort().
if(is_dir($pfad_absolut))
{
$_SERVER['dirs']++; # zum Zählen der Ordner
$array[$file] = getfiles($pfad_absolut);
@asort($array[$file]);
}
else
{
$_SERVER['files']++; # zum Zählen der Dateien
$array[$file] = $file;
@asort($array);
}

Um bei den Ordnern auch den Ordnernamen beizubehalten wird dieser im Array als Schlüssel verwendet. Die Sortierfunktion asort() sortiert jedoch nicht genau nach dem Alphabet. Die Großbuchstaben kommen zuerst und danach kommen erst die Kleingeschriebenen Dateien. Um eine natürliche Sortierung vorzunehmen ersetzen wir daher
$array[$file] = $file;
durch
$array[$file] = strtolower($file);

Der Originalname ist nach der Sortierung stets der Schlüssel. strtolower() ist daher nur das Hilfsmittel um die Dateien sinngemäß zuordnen.
Bei den Ordnern ist der Schlüssel auch der Name des Ordners, denn es ergibt sich hieraus wieder ein Array (getfiles() ). Mit Unterordnern passiert also genau das gleiche, wie auch mit dem Hauptverzeichnis. Alle Ordner durchlaufen die gesamte Funktion.

Damit wäre der erste Teil beendet. Nun folgt aber der Zweite.
Das Ausgeben der Verzeichnisse.

Da wir auch hier wieder rekursiv arbeiten müssen - die Funktion muss sich bei einem Ordner bzw. Array ebenfalls wieder selbst aufrufen - brauchen wir auch wieder eine Funktion.

Diese nennen wir mal printout(). Die Ausgabe kann sofort mittels print oder echo erfolgen, da die Dateien bereits vorher sortiert wurden. - Daher kann der Rückgabewert (return) nichts weiter als 'true' sein.

Als Eingabewerte brauchen wir nicht nur das Array mit den Verzeichnissen, sondern auch den Pfad - den Grund werden wir später erkennen.
Da es auch Ordner gibt, die noch keine Dateien haben können wir diese am Anfang durch eine if-Schleife ausschließen.
function printout($array,$path)
{
if(empty($array)){return true;}
# [...]
return true;
}

Mit foreach... ist es nun eine Leichtigkeit Ordner und Dateien auszugeben. Aus jedem Array-Wert erhält man den Schlüssel $key und den Wert $val.
Den Pfad brauchen wir nun um zwischen Dateien und Ordnern zu unterscheiden.
Wir überprüfen mit der Negation von is_file() ob der Schlüssel aus dem Array eine Datei ist. Wenn dieser eine Datei ist und die Datei existiert, so soll die Dateiendung ausgelesen werden und eine Grafik aus einem beliebigen Verzeichnis angezeigt werden. Diese Grafiken haben die Form Dateiendung.gif.
Beispiel: Dateiname ist index.php die Endung (alles hinter dem letzen Punkt) ist php => die Grafik sollte php.gif sein.
foreach($array as $key => $val)
{
$pfad_absolut = $path."/".$key;
if(!is_file($pfad_absolut))
{
# [...]
}
else
{
$ext = explode(".",$key); $filetype = strtolower($ext[(count($ext)-1)]); unset($ext); $ext = $filetype;
echo "<img src='img/".$src.".gif'> ".$key."<br>";
}
}

Als Namen verwenden wir immer den Schlüssel $key, da der Wert $val (siehe Funktion getfiles() ) den klein geschriebenen Dateinamen enthält.

Erläuterung zur Dateiendung:
$ext = explode(".",$key); - Teilt den Sting $key an den Stellen, an denen sich ein Punkt befindet.

$filetype = strtolower($ext[(count($ext)-1)]); - konvertiert den letzten Teil des Arrays (count($ext)-1) in Kleinbuchstaben

unset($ext); $ext = $filetype; - überschreibt den Wert von $ext zur weiteren Verwendung
Bei Ordnern geben wir den Ordnernamen ebenfalls mit einer Grafik davor aus und überprüfen wir, ob in dem Ordner überhaupt etwas enthalten ist - sprich, ob $val wiederum ein Array ist. Ist dies der Fall, so soll der Inhalt dieses Arrays wiederum mit printout() ausgegeben werden. Um das Ganze anschaulich zu machen rücken wir den Teil vorher durch ein Div-Element um 30 Pixel ein. Der Funktion printout() wird nun der absolute Pfad mit übergeben, damit wieder überprüft werden kann, ob ein Wert eine Datei oder ein Ordner ist.
echo "<img src='verzeichnis.gif'> <b>".$key."</b><br>";
if(!empty($array[$key]))
{
echo "<div style='margin-left:30px;'>";
printout($array[$key],$pfad_absolut);
echo "</div>";
}

Um die Ausgabe von $_SERVER[files] und $_SERVER[dirs] zu verschönern und auch grammatikalisch richtig zu setzen überprüfen wir diese durch folgendes Konstrukt:
$i = $_SERVER[files]; $h = $_SERVER[dirs];

if($i==1){echo " $i Datei ";} else{echo "$i Dateien ";}
if($h==1){echo " $h Verzeichnis ";} else{echo " $h Verzeichnisse ";}
echo " Insgesamt ".($i+$h)."<br>";

Um jetzt ein Verzeichnis auszulesen nehmt den folgenden Code:
$pfad = "./"; # Verzeichnis

$_SERVER[dirs]=0; $_SERVER[files]=0;

$array = getfiles($pfad);

$i=$_SERVER[files]; $h=$_SERVER[dirs];
if($i===1){echo " $i Datei ";} else{echo "$i Dateien ";}
if($h==1){echo " $h Verzeichnis ";} else{echo " $h Verzeichnisse ";}
echo " Insgesamt ".($i+$h)."<br>";

printout($array,$pfad);

___________________________
Das Einzige Problem, das besteht ist, dass die Ordner im Startverzeichnis nicht alphabetisch sortiert werden.

Die Grafiken müssen selbst erstellt bzw. angepasst werden !

Bei Problemen oder Verbesserungen PN oder: http://arve.lima-city.de/kontakt.php
Das Tutorial kann auch unter der folgenden URL eingesehen werden:
http://arve.lima-city.de/tutorials/
___________________________

mfg
Arve

endgültigerQuelltext

$pfad = "./";

$_SERVER[dirs]=0;
$_SERVER[files]=0;

$array = getfiles($pfad);

$i=$_SERVER[files]; $h=$_SERVER[dirs];
if($i===1){echo " $i Datei ";} else{echo "$i Dateien ";}
if($h==1){echo " $h Verzeichnis ";} else{echo " $h Verzeichnisse ";}
echo " Insgesamt ".($i+$h)."<br>";

printout($array,$pfad);

function printout($array,$path)
{
if(empty($array)){return true;}
foreach($array as $key => $val)
{
$pfad_absolut = $path."/".$key;
if(!is_file($pfad_absolut))
{
echo "<img src='images/folder.gif'> <b>".$key."</b><br>";
if(!empty($array[$key]))
{
echo "<div style='margin-left:30px;'>";
printout($array[$key],$pfad_absolut);
echo "</div>";
}
}
else
{
$ext=explode(".",$key);$filetype=strtolower($ext[(count($ext)-1)]);unset($ext);$ext=$filetype;
if(file_exists($pfad."img/".$ext.".gif")){$src = $ext;} else{$src="leer";}
echo "<img src='images/".$src.".gif'> ".$key."<br>";
}
}
return true;
}

function getfiles($pfad)
{
$array = array();
$open = @opendir($pfad);
while ($file = @readdir($open))
{
if($file=='.' OR $file ==".."){continue;}

$pfad_absolut = $pfad."/".$file;
if(is_dir($pfad_absolut))
{
$_SERVER['dirs']++;
$array[$file] = getfiles($pfad_absolut); @asort($array[$file]);
}
else
{
$_SERVER['files']++;
$array[$file] = strtolower($file); @asort($array);
}
}
closedir($open);

return $array;
}

Bewertung Anzahl
6
88,9 %
8 Bewertungen
3
11,1 %
1 Bewertungen