Pergunta

Como posso recuperar a árvore de diretórios completa usando SPL, possivelmente usando RecursiveDirectoryIterator e RecursiveIteratorIterator?

Foi útil?

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 */
    //...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top