Como posso recuperar a árvore de diretórios completa usando SPL?
Pergunta
Como posso recuperar a árvore de diretórios completa usando SPL
, possivelmente usando RecursiveDirectoryIterator
e RecursiveIteratorIterator
?
Solução
Por padrão, o RecursiveIteratorIterator
usará LEAVES_ONLY
para o segundo argumento para __construct
. Isso significa que ele irá retornar apenas arquivos. Se você quiser incluir arquivos e diretórios (pelo menos é o que eu considero um completo diretório árvore), você teria que fazer:
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::SELF_FIRST
);
e então você pode foreach
sobre ele. Se você quiser retornar a árvore de diretórios em vez de reproduzir-lo, você pode armazená-lo em uma matriz, por exemplo.
foreach ($iterator as $fileObject) {
$files[] = $fileObject;
// or if you only want the filenames
$files[] = $fileObject->getPathname();
}
Você também pode criar a matriz de $fileObjects
sem a foreach
fazendo:
$files[] = iterator_to_array($iterator);
Se você só deseja diretórios voltou, foreach
sobre o $iterator
assim:
foreach ($iterator as $fileObject) {
if ($fileObject->isDir()) {
$files[] = $fileObject;
}
}
Outras dicas
Você pode apenas, ou fazer tudo o que você quer
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file)
{
/* @var $file SplFileInfo */
//...
}