Parcourir les fichiers c’est simple avec PHP 5 et la SPL. Ou pas.
<?php class bigFileFilterIterator extends FilterIterator { public function accept() { $oFileInfo = $this->getInnerIterator()->current(); return ($oFileInfo->getSize() > 10000); } } $themedir = __DIR__.'/theme'; $iterator = new RecursiveDirectoryIterator($themedir, FilesystemIterator::SKIP_DOTS); $iterator->setFlags(FilesystemIterator::CURRENT_AS_FILEINFO); $recursiveIterator = new RecursiveIteratorIterator($iterator); foreach(new bigFileFilterIterator($recursiveIterator) as $file) { echo $file->getfilename()."n"; }
Sérieusement ? Mais pourquoi ne puis-je pas utiliser directement le RecursiveDirectoryIterator et dois-je instancier un RecursiveIteratorIterator ? Celui qui a conçu cette dernière classe souffre-t-il de bégayement ? Rien que l’instanciation du premier itérateur ne tient pas sur une seule ligne. Un ->getInnerIterator()->current() et pas un paramètre directement dans la méthode ->accept() ? Sérieusement ?
Montrer les nouvelles possibilités c’est appréciable, les qualifier de simple est une insulte à l’intelligence.
De mon temps on faisait quelque chose comme ce qui suit :
<?php function recursive_filter($path) { $dir = dir($path) ; while (false !== ($name = $dir->read())) { if ($name[0] === '.') return ; $new_path = $path.DIRECTORY_SEPARATOR.$name ; if (is_dir($new_path)) { recursive_filter($new_path) ; } elsif (file_size($new_path) > 10000) { echo $new_path ; } } } $themedir = __DIR__.'/theme'; recursive_filter( $themedir ) ;
Ce n’était pas plus court, mais pas plus long. On peut entrer dans de longs discours pour savoir si c’était plus simple ou plus complexe, mieux structuré ou non, mais la valeur ajoutée du nouveau code ne saute pas aux yeux côté simplicité je trouve.
À titre d’exemple, en ruby (« find » est dans la lib standard) :
require 'find' theme_dir = File.dirname(__FILE__)."/theme" Find.find(theme_dir) do |path| next if FileTest.directory?(path) puts path if FileTest.size(path) > 10000 end
Ou sur Python :
import os themedir = os.path.join(os.path.dirname(__file__), "theme") def find_files(directory): for root, dirs, files in os.walk(directory): for basename in files: if not file.startswith("."): filename = os.path.join(root, basename) yield filenames for filename in find_file(themedir) if os.path.getsize(filename) > 10000 : print filename
Il peut y avoir des fautes et il peut y avoir mieux dans les différents langages, et peu importe le nombre de lignes, mais dans les quatre codes précédents c’est bien le premier qui me semble complexe.
Il y a bien d’autres occasions de trouver PHP « simple », mais pas les itérateurs de la SPL.
Laisser un commentaire