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
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;
}
}
|
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 />';
}
?>
|
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 />';
}
?>
|
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();
?>
|
Den Code findet ihr einmal sichtbar unter
http://demo.easy-coding.de/php/reading-directory/ und als
Zip Datei zum Download.
report critical content