You are not logged in.

This articles has been requested to be deleted.

Wednesday, January 14th 2009, 8:52am

Tags

dateisystem, fallback, Ordner, scandir

Abstract

Beispiele um Ordner mit PHP auszulesen

Article

1. PHP Abwärtskompatiblität


Mit PHP 5 ist eine neue Funktion namens scandir eingeführt worden um Ordner auszulesen. Soweit ich das überblicke arbeitet sie besser mit Streams. Die einzige offensichtliche Änderung ist dagegen nur eine sortierte Liste als Rückgabewert. Um den Code PHP4 kompatibel zu halten, definieren wir einen Nachbau der Funktion als Fallback Lösung, falls die Funktion noch unbekannt ist. In den Beispielen inkludieren wir die Funktion über die Datei scandir_fallback.php.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!function_exists('scandir')) {
	function scandir($directory, $sorting_order=0) {
		if(!is_dir($directory)) {
			return false; 
		}
		$files = array();
		$handle = opendir($directory);
		while (false !== ($filename = readdir($handle))) {
			$files[] = $filename; 
		}
		closedir($handle);
 
		if($sorting_order == 1) {
			rsort($files); 
		} else {
			sort($files); 
		}
		return $files;
	}
}


2. Order auslesen ganz einfach


Es ist ganz einfach einen Ordner mit PHP auszulesen. Hier zeige ich euch die einfachste Variante.
Tragt für den Ordner einen . (Punkt) ein, dann wird der Inhalt des aktuellen Ordners ausgegeben. Mit .. (Punkt-Punkt) lest ihr den Ordner oberhalb des eigenen aus. Wer schon einmal auf der Konsole gearbeitet hat, kennt das.

PHP Quellcode

1
2
3
4
5
6
7
8
<?php
require_once 'scandir_fallback.php';
$folder = 'unterordner';
$fileArray = scandir($folder);
foreach($fileArray as $file) {
	echo $file.'<br />';
}
?>



3. Nach Bearbeitungszeit sortieren


Auf Basis dieses Skript lassen sich natürlich weitere Anwendungen programmieren..
Wir können das fileArray auch um ein weiteres Element erweitern, dass wir mit beliebigen Informationen füttern können um danach zu sortieren. Es wird hier bewusst nicht der Schlüssel verwendet, da unterschiedliche Elemente mit dem selben Zeitschlüssel so nicht hätten aufgenommen werden können.

Stattdessen schreiben wir eine eigene Vergleichsfunktion, die wir usort als Parameter übergeben.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
require_once 'scandir_fallback.php';
$folder = './';
$fileArray = scandir($folder);
foreach($fileArray as $i => $file) {
	$modified = filemtime($folder.$file); //Liefere Unix Zeitstempel
	$fileArray[$i] = array($modified, $file);
}
 
usort($fileArray, create_function('$a, $b', 'if ($a[0] == $b[0]) return 0; else return $a[0]>$b[0]? +1 : -1;'));
foreach($fileArray as $row) {
	echo $row[1].'<br />';
}
?>



4. Rekursiv alle Unterordner auslesen


Das letzte Beispiel ist schon ausgereifter. Es handelt sich um eine so genannte rekursive Methode. Die Funktion ruft sich selbst auf und stellt alle Ordner rekursiv dar.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
require_once 'scandir_fallback.php';
function ordnerinhalt($folder='.') {
	$content = "";
 
	foreach(scandir($folder) as $file) {
		if($file[0] != '.') { // Versteckte Dateien nicht anzeigen
			if(is_dir($folder.'/'.$file)) {
				$folderArray[] = $file;
			} else {
				$fileArray[] = $file;
			}
		}
	}
 
	// Erst die Ordner ausgeben
	if(isset($folderArray)) {
		foreach($folderArray as $row) {
			$content .= '<b>'.$row.'</b><br />';
			$content .= '<div style="padding-left:10px;color:#afafaf" />'; //Unterordner nach Rechts einrücken
			$content .= ordnerinhalt($folder.'/'.$row); // rekursive Funktion
			$content .= '</div>';
		}
	}
 
	// ...dann die Dateien ausgeben
	if(isset($fileArray)) {
		foreach($fileArray as $row) {
			$content .= '<a href="'.$folder.'/'.$row.'">'.$row.'</a><br />'; //Dateien verlinken
		}
	}
 
	// Rekursion ende
	return $content;
}
 
echo ordnerinhalt();
?>


5. Demo


Den Code findet ihr einmal sichtbar unter http://demo.easy-coding.de/php/reading-directory/ und als Zip Datei zum Download.

Lexikon 4.1.3, developed by www.viecode.com