PHP: Verzeichnis + Unterverzeichnisse auslesen

Hi.

wie kann ich in php ein Verzeichnis und evtl. Unterordner im Verzeichnis rekursiv durchsuchen, um alle (Bild)-Dateien (per Schleife) anzeigen zu lassen ?

Ein kleines Beispiel wäre nicht schlecht. :slight_smile:

Wie du gesagt hast: rekursiv
de2.php.net/manual/de/function.opendir.php
Damit lässt sich der Ordner inhalt auflisten, weiter runter gescrollt ist auch sein schönes Beispiel.

filetype() liefert dort entweder den string “dir” oder “file” zurück, wnen es “dir” ist, brauchst du halt den Pfad inkl. Ordnername nur noch mal an die Funktion übergeben.

Edit:

<?php


function listdir_r($dir, $d = 0){
	if (is_dir($dir)) {
		if ($dh = opendir($dir)) {
			while (($file = readdir($dh)) !== false) {
				if($file != "." && $file != ".."){
					if(filetype($dir . $file) == "dir"){
						echo str_repeat(chr(32),$d*4).$dir.$file."/\n";
						$d++;
						listdir_r($dir.$file."/", $d);
						$d--;
					}else{
						echo str_repeat(chr(32),$d*4).$file."\n";
					}
				}
			}
			closedir($dh);
		}
	}
}


listdir_r("./");

?>

Ist es das hier:

[code]<?php
function listFiles( $from = ‘.’)
{
if(! is_dir($from))
return false;

$files = array();
$dirs = array( $from);
while( NULL !== ($dir = array_pop( $dirs)))
{
    if( $dh = opendir($dir))
    {
        while( false !== ($file = readdir($dh)))
        {
            if( $file == '.' || $file == '..')
                continue;
            $path = $dir . '/' . $file;
            if( is_dir($path))
                $dirs[] = $path;
            else
                $files[] = $path;
        }
        closedir($dh);
    }
}
return $files;

}
?>[/code]

Ich brings einfach nicht zum laufen.

Bei mir wird immer nix angezeigt.

Mein Aufruf:
listFiles(’/users/c91/www/home/’);

Er soll den Dateiinhalt des “home”-Verzeichnisses anzeigen. Das Verzeichnis befindet sich direkt im root-Verzeichnis des Servers.

Falls du es nicht mitbekommen hast, ich hab mein Beitrag oben mit einem Beispiel editiert.
Die Funktion dort gibt die Verzeichnisstruktur einfach nur aus.

an der Stelle “geschieht” die rekursion. die Funktion ruft sich selber nochmal auf:

                  $d++;
                  listdir_r($dir.$file."/", $d);
                  $d--;

mfg Balmung

Ok. Danke

Ich habs jetzt hinbekommen.

Aber kann ich auch die Ausgabe so ändern,
dass sie z.B. Alphabetisch oder so, wie ich sie im FTP-Server sehe,
ausgegeben wird ?

opendir und readdir sind system abhängig. die funktionen erhalten die Ordern-/Dateinamen so, wie sie vom System hergegeben werden, was in den meisten Fällen nicht alphabetisch ist.
Um das Alphabetisch zu machen, müsste man die Dateien in einem Array zwischenspeichern, und dann mit sort() sortieren lassen.

mfg Balmung

Edit:
so in etwa:

<?php

function listdir_r($dir, $d = 0){
	$tmp = array();
	if(is_dir($dir)){
		if($dh = opendir($dir)){
			while (($file = readdir($dh)) !== false) {
				if($file != "." && $file != ".."){
					$tmp[] = $file;
				}
			}
			closedir($dh);
		}
	}
	sort($tmp);
	foreach($tmp as $file){
		if(filetype($dir.$file) == "dir"){
			echo str_repeat(chr(32),$d*4).$file."/\n";
			listdir_r($dir.$file."/", $d+1);
		}else{
			echo str_repeat(chr(32),$d*4).$file."\n";
		}
	}
}

?>
$d++;
listdir_r($dir.$file."/", $d);
$d--;

wäre da das nicht besser?

listdir_r($dir.$file."/", $d+1);

natürlich wäre es das.
kopfkratz

Danke.
Geht einwandfrei !