Eigentlich sollte der Titel des Artikels „Mit SPL ein Verzeichnis auflisten“ lauten. Also, es war mal wieder ganz spannend zu entdecken, was die SPL Iteratoren so drauf haben. Hier habe ich mir einen Script gebaut das unabhängig von seiner Position bzw. Verortung im System, ein beliebiges Verzeichnis samt seinen Unterverzeichnisse und Dateien, hierarchisch auflisten kann.
Kurz zum Script: die Klasse RecursiveIteratorIterator bietet, die Möglichkeit rekursiv durch die Elemente einer Menge zu durchlaufen. Als ersten Parameter erwartet es eine Klasse die das RecursivIterator Interface implementiert hat. Der zweite Parameter bestimmt in welcher Reihenfolge durch die Menge iteriert werden soll. Der dritte Paramter gibt an, ob die Klasse bei einem fehlerhaften Versuch, die Kinder-Elemente zurück zu geben, den Ausnahmefehler ignorieren oder den Ausnahmefehler werfen soll. Als Standard wird jedoch immer ein Ausnahmefehler geworfen.
Das Script wird am besten in die Kommandozeile gestartet. Dabei kann es auch ohne Parameter gestartet werden, so wird die Struktur aufgelistet wo sich das Script befindet.
php folderlist.php /your/directory/you/want/be/listed/
Hier der Quellcode. Ihr könnt es kopieren, verändern und ausprobieren. Hoffe dass jemand dafür Verwendung findet und ich damit den jenen glücklich machen kann. :-)
< ?php /* * This script should be placed in your top level. * You can run it with "php folderlist.php /your/directory/you/want/be/listed/" * That was it! Then you get something like: * * Your path: /your/directory/you/want/be/listed/tests/PdfGenerator/ * -------------------------------------------------- * | | Form/ * | | | _drafts/ * | | PdfTest.php * | | | ./ * | | StructureTest.php * | | | _files/ * | | | content-bottom.partial * | | | content-datenschutz.partial * | | | content-top.partial * | | | process-file-as-pdf.ini * | | | process.ini * | | | . * | | | ../ * -------------------------------------------------- * */ try { $path = dirname(__FILE__); if (true === isset($argv[1])) { if (false === is_dir($argv[1])) { die('The path you`ve specified is not available!'.PHP_EOL); } $path = $argv[1]; } print PHP_EOL.'Your path: '.$path.PHP_EOL; $directory = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); print '--------------------------------------------------'.PHP_EOL; foreach ($directory as $file) { /* @var $innerIterator RecursiveDirectoryIterator */ $innerIterator = $directory->getInnerIterator(); if(true === $innerIterator->isDot()) { $directory->next(); } $filename = (true === $innerIterator->isDir()) ? '| '.basename($file).'/' : basename($file); printf('%s%s%s', str_repeat('| ', $directory->getDepth()+1), $filename, PHP_EOL); } print '--------------------------------------------------'.PHP_EOL; } catch (Exception $e) { die($e->getMessage()); }
Rennt sogar ziemlich schnell. Die SPL Iterator sind wirklich ne feiner Sache die leider viel zu oft verkannt werden.