Verzeichnis Baum
So gebe ich den Inhalt eines Ordners aus (unterschiedliche Lösungsansätze und Ausgabeformen).
Ordner lesen
Ich kann einen Ordner öffnen, lesen und schliessen, als wäre er eine Datei. Dazu erstelle ich einen Ordnerhandle (analog einem Dateihandle) den ich den Funktionen übergebe.
opendir(), readdir(), closedir()
<?php
$dirname = ("Testordner"); // zu durchsuchenden Ordner
$dh = opendir($dirname); // Variable fasst DirectorieHandler analog zu FilePointer
while ($file=readdir($dh)) { // Schleife solange es etwas zu lesen gibt *
if ($file != "geheim.php") { // gewisse Dateien ausschliessen
echo "$file<br/>\n"; // zeilenweise ausgeben
}
}
closedir($dh); // schliessen des Ordners
?>
* Das funktioniert nur so, wenn es keine Datei und keinen Unterordner namens '0' oder 'false' hat!
Zudem werden nicht nur Dateien, sondern auch Ordnernamen ausgegeben.
Inhalte dieser Unterordner werden aber nicht angezeigt.
Diese einfache, zeilenweise Ausgabe des Ordnerinhaltes wird weiter unten durch Einrückungen oder durch Bildchen von Ordner- und Dateisymbolen, oder als Linkliste besser dargestellt. Auch werde ich die Inhalte der gefundenen Unterordner auflisten.
.
..
Text.txt
dokument.php
Folder
treeicon_ordner.png
treeicon_file.png
nocheinfile.php
file.php
datei.php
noextension
Ordner
Die php Klasse dir()
dir()
PHP hat eine Klasse vordefiniert die heisst 'dir()' und ist sehr praktisch.
Ihre Eigenschaften (Variablen) sind 'handle' - Zugriffsnummer und 'path' - der Pfad des aktuellen Verzeichnis.
Ihre Methoden (Funktionen) sind:
- dir() - Konstruktor dem das zu öffnende Verzeichnis übergeben wird
- read() - liest nacheinander die Einträge aus
- rewind() - setzt den Zeiger auf den ersten Eintrag zurück
- close() - gibt Handle frei und schliesst Verzeichnis.
<?php
// aus der Klasse dir wird das Objekt $verzeichnis instanziiert
$verzeichnis = dir ("Testordner"); // zu durchsuchendes Verzeichnis
// das Objekt $verzeichnis wird der Methode read übergeben
while ($eintrag = $verzeichnis->read()) {
if ($eintrag != "." && $eintrag != ".." && $eintrag != "geheim.php") { // mit && einiges ausschliessen
// falls kein Punkt im String
if (strpos($eintrag,".") == 0){
echo "<img src='images/treeicon_ordner.png' alt=''/> ";
} else {
echo "<img src='images/treeicon_file.png' alt=''/> ";
}
echo "$eintrag<br>\n";
}
}
$verzeichnis->close();
?>
Text.txt
dokument.php
Folder
treeicon_ordner.png
treeicon_file.png
nocheinfile.php
file.php
datei.php
noextension
Ordner
Nicht täuschen lassen: die Reihenfolge der Einträge wird je nach Server unterschiedlich unsortiert und Ordner sind nicht daran zu erkennen, dass sie keine Dateiendung, also keinen Punkt im Namen haben.
Geordnetes Verzeichnis
<?php
$path = "."; // aktueler Ordner, also php
$dh = @opendir($path);
while (false !== ($file=readdir($dh))) // funktioniert auch bei Files namens '0' oder 'false'
{
if (is_file($file)) // nur Files
$files[] = array(filemtime($file),$file); // 2-D Array
}
closedir($dh);
if ($files)
{
rsort($files); // rückwärts sortieren!
$count = 1; // Zähler Startwert
foreach ($files as $file)
{
if (strpos($file[1],".php") == true && $file[1] != 'geheim.php') // Ausschluss
{
// file[0] ist Unix timestamp - file[1] ist filename
echo date('d.m.Y', $file[0]).": $file[1]<br />\n";
$count++; // Zähler um 1 erhöhen
if ($count >10) { break; } // nach 10 das Script abbrechen
}
}
}
?>
Die 10 frischesten (kürzlich revidierten) Dateien im Teil PHP sind:
20.05.2012: einfuehrung.php19.05.2012: db_tabelle.php
19.05.2012: sicherheit.php
19.05.2012: db_erweitern.php
19.05.2012: img_resize_script.php
19.05.2012: funktion.php
19.05.2012: datei.php
19.05.2012: standard.php
19.05.2012: syntax.php
19.05.2012: array_numerisch.php
Nur Bilder
<?php
$dir = opendir ("images");
while (false !== ($file = readdir($dir)))
{
if (strpos($file, '.gif',1)||strpos($file, '.jpg',1)||strpos($file, '.png',1) )
{
echo "<img src='images/".$file."' alt='Thumbnail' width='20px' height='20px' /> ";
echo "$file <br />";
}
}
?>
MySQL_konsole_01.gif
fl_de.gif
xampp_start.png
myAdmin_anzeige.gif
tabelle_explorer.gif
php538.png
tabelle_csv.gif
fl_gb.gif
tabelle_exel.gif Verlinkte Liste mit Unterordner
Die Liste verlinkt nur Dateien, keine Ordner, denn in denen müsste es sonst zwingend index-Dateien haben.
<?php
// Funktion
function list_dir($dir_handle,$path)
{
echo "<ol>";
//running the while loop
while (false !== ($file = readdir($dir_handle))) {
$dir =$path.'/'.$file;
if(is_dir($dir) && $file != '.' && $file !='..' ) // Falls dies ein Ordner ist
{
$handle = @opendir($dir) or die("unable to open file $file");
echo "<li><strong>$file</strong></li>";
list_dir($handle, $dir); // startet Funktion erneut im Innern des Ordners
}
elseif($file != '.' && $file !='..' && $file !='geheim.php') // Falls dies kein Ordner ist
{
echo "<li><a href='".$dir."'>$file</a></li>";
}
}
echo "</ol>";
// Ordner schliessen
closedir($dir_handle);
}
// von hier aus relativer Pfad zum Ordner angeben
$path = "Testordner";
// Ordner öffnen, Funktion starten
$dir_handle = @opendir($path) or die("Unable to open $path");
list_dir($dir_handle,$path);
?>
- Text.txt
- dokument.php
- Folder
- treeicon_ordner.png
- treeicon_file.png
- nocheinfile.php
- file.php
- datei.php
- noextension
- Ordner
Mehrdimensionaler Array
Ein mehrdimensionaler Array, geladen mit dem Ordner- und Unterordnerinhalt, bietet mehr Möglichkeiten zur weiteren Analyse, Manipulation oder Ausgabe.
<?php
function MakeDirArray($dir = "Testordner")
{
$listDir = array();
if($handler = opendir($dir))
{
while (($sub = readdir($handler)) !== FALSE) {
if ($sub != "." && $sub != ".." && $sub != "geheim.php") {
if(is_file($dir."/".$sub)) {
$listDir[] = $sub;
} elseif(is_dir($dir."/".$sub)) {
$listDir[$sub] = MakeDirArray($dir."/".$sub);
}
}
}
closedir($handler);
}
return $listDir;
}
// Funktion aufrufen
$listDir = MakeDirArray();
// Ausgeben
print '<pre>';
print_r ($listDir); // Test
print '</pre>';
?>
Array
(
[0] => Text.txt
[1] => dokument.php
[Folder] => Array
(
[0] => datei_imFolder.php
[1] => dokument_imFolder.php
[2] => Text_imFolder.txt
[3] => file_imFolder.php
)
[2] => treeicon_ordner.png
[3] => treeicon_file.png
[4] => nocheinfile.php
[5] => file.php
[6] => datei.php
[7] => noextension
[Ordner] => Array
(
[0] => file_imOrdner.php
[1] => Text_imOrdner.txt
[2] => dokument_imOrdner.php
[3] => datei_imOrdner.php
)
)
Einfacher Array
Weil die Angaben wie Namen von Ordner und Unterordner bereits im Pfad vorhanden sind, liessen sich daraus Gruppierungen auch erst bei einer Ausgabe erstellen. Dann würde ein einfacherer Array in der Praxis vorläufig genügen, zumal ein einfacher Array auch leichter mit einem bestehenden Array zu vergleichen ist.
<?php
// Erste Ebene
function MakeDirArraySimple($dir)
{
$listFiles = array();
if($handler = opendir($dir)) {
while (($sub = readdir($handler)) !== FALSE) {
if ($sub != "." && $sub != ".." && $sub != "geheim.php") {
if(is_file($dir."/".$sub)) {
$ziel = realpath($dir."/".$sub);
$listFiles[] = $ziel;
// Zweite Ebene (dies geht nur eine Unterebene tief)
} elseif(is_dir($dir."/".$sub)) {
$path = $dir."/".$sub;
if($handler2 = opendir($path)) {
while (($sub = readdir($handler2)) !== FALSE) {
if ($sub != "." && $sub != ".." && $sub != "geheim.php") {
if(is_file($path."/".$sub)) {
$ziel = realpath($path."/".$sub);
$listFiles[] = $ziel;
}}} closedir($handler2);
}}}}
closedir($handler);
}
return $listFiles;
}
$dir = "Testordner";
$listFiles = MakeDirArraySimple($dir);
print '<pre>';
print_r ($listFiles); // Test
print '</pre>';
?>
Array
(
[0] => /home/bieferc/www/lehrling/php/Testordner/Text.txt
[1] => /home/bieferc/www/lehrling/php/Testordner/dokument.php
[2] => /home/bieferc/www/lehrling/php/Testordner/Folder/geheim.php
[3] => /home/bieferc/www/lehrling/php/Testordner/Folder/datei_imFolder.php
[4] => /home/bieferc/www/lehrling/php/Testordner/Folder/dokument_imFolder.php
[5] => /home/bieferc/www/lehrling/php/Testordner/Folder/Text_imFolder.txt
[6] => /home/bieferc/www/lehrling/php/Testordner/Folder/file_imFolder.php
[7] => /home/bieferc/www/lehrling/php/Testordner/treeicon_ordner.png
[8] => /home/bieferc/www/lehrling/php/Testordner/treeicon_file.png
[9] => /home/bieferc/www/lehrling/php/Testordner/nocheinfile.php
[10] => /home/bieferc/www/lehrling/php/Testordner/file.php
[11] => /home/bieferc/www/lehrling/php/Testordner/datei.php
[12] => /home/bieferc/www/lehrling/php/Testordner/noextension
[13] => /home/bieferc/www/lehrling/php/Testordner/Ordner/file_imOrdner.php
[14] => /home/bieferc/www/lehrling/php/Testordner/Ordner/Text_imOrdner.txt
[15] => /home/bieferc/www/lehrling/php/Testordner/Ordner/geheim.php
[16] => /home/bieferc/www/lehrling/php/Testordner/Ordner/dokument_imOrdner.php
[17] => /home/bieferc/www/lehrling/php/Testordner/Ordner/datei_imOrdner.php
)