| SPL - Die Standard PHP Library - Mit Verzeichnissen arbeiten |
|
Seite 3 von 7
Mit Verzeichnissen arbeiten - DirectoryIteratorWas für Arrays die ArrayIterator Klasse ist, ist für Verzeichnisse die DirectoryIterator Klasse. Diese Klasse stellt Methoden zu Verfügung mit der wir ohne großen Aufwand gängige Verzeichnis-Aktionen ausführen können. Schauen wir uns im Schnelldurchlauf mal die wichtigsten Methoden an, die weitestgehend selbsterklärend sind. Neben den üblichen 5 Verdächtigen der Iterator Klasse (siehe oben) stehen weiterhin zur Verfügung:
Die DirectoryIterator Klasse umfasst etwa dreimal soviele Methoden wie die hier gezeigten, aber das sind meiner Meinung nach die wichtigsten. Das Auslesen eines Verzeichnis ist sehr einfach und mit wenigen Zeilen Code erledigt. $verzeichnis = new DirectoryIterator( "testdateien/" ); while ($verzeichnis->valid()) { echo $verzeichnis->current(). " (" .$verzeichnis->getSize(). ")<br />"; $verzeichnis->next(); } Wir erzeugen ein Objekt von der DirectoyIterator Klasse und übergeben dabei den Verzeichnisname dessen Inhalt wir ausgeben lassen möchten. Die Struktur der while()-Schleife sollte nun bekannt sein. Zusätzlich lassen wir uns noch zu jeder Datei die Größe ausgeben, was für uns die Methode getSize() der DirectoyIterator Klasse übernimmt. Das Ergebnis sieht allerdings nicht sonderlich ansprechend aus, wie man im folgenden Listing sieht: . (0) .. (0) bilder (0) controller.php (4901) includes (0) m3_saz.jpg (72517) mixed (0) whois.php (21563) whois.zip (3718) Da sind Dateien mit Ordnern vermischt und auch "." ".." sehen nicht sonderlich gut aus. Wir bekommen ausserdem nur die Dateien aus dem angegebenen Ordner, was meistens wenig nützlich ist. Um herauszufinden was in den anderen Ordnern steckt müssen wir anfangen eine umständliche Funktion zu schreiben, die uns rekursive durch die Verzeichnisse navigieren läßt. Für diesen Zweck gibt es ja auch die nötigen Boardmittel wie isDot() oder auch isDir(). Verzeichnisse rekursive auslesen mit der RecursiveDirectoryIterator Klasse Die RecursiveDirectoryIterator Klasse bringt im Vergleich zur DirectoryIterator Klasse nur 2 neue Methoden mit, aber die sind überaus nützlich. Diese beiden Methoden sind:
Mit diesen beiden zusätzlichen Methoden können wir jetzt wirklich ganz bequem eine sehr übersichtliche Funktion erstellen, um rekursive durch Verzeichnisse zu navigieren. Here we go... function VerzeichnisBaum( RecursiveDirectoryIterator $zeiger ) { echo '<ul>'; for ($zeiger->rewind(); $zeiger->valid(); $zeiger->next()) { if ($zeiger->isDir() && !$zeiger->isDot()) { echo '<li><span class="hinweis">' .$zeiger->getFilename(). '</span></li>'; if ($zeiger->hasChildren()) { $unterverzeichnis = $zeiger->getChildren(); echo '<ul>' . VerzeichnisBaum( $unterverzeichnis ) . '</ul>'; } } elseif ($zeiger->isFile()) { echo '<li><em>'. $zeiger->getFilename() . '</em></li>'; } } echo '</ul>'; } VerzeichnisBaum( new RecursiveDirectoryIterator( 'testdateien/' ) ); Die Basisversion dieser Funktion habe ich aus dem Buch "PHP 5 - Grundlagen und Profiwissen von Jörg Krause". Allerdings habe ich die Funktion etwas abgewandelt um sie verständlicher zu machen. |