PHP: Percorrendo diretórios com SPL

Palavras-chave: PHP, Iterators, diretórios, percorrer, iterar, SPL

A forma mais comum de se ler o conteúdo de um diretório em PHP é utilizando um laço de repetição WHILE em conjunto com as funções opendir() e readdir(), como no exemplo a seguir:

<?php
$dir = opendir('/tmp');
while ($arquivo = readdir($dir))
{
    echo "$arquivo<br>\\n";
}
closedir($dir);
?>

O uso da função readdir() é simples, permite iterar por todos os arquivos de um diretório. Quando a leitura do diretório acabar, a função retorna FALSE, caindo fora do loop. Porém, se existir algum arquivo com o nome “0”, a função retornará vazio, e a comparação também abortará o loop. A solução é simples, basta uma comparação absoluta com o valor FALSE:

while (($arquivo = readdir($dir)) !== FALSE)

Apesar de simples, estes testes são suscetíveis ao esquecimento do programador. Felizmente o PHP5 introduz iterators, que são uma forma bem mais elegante de se percorrer cadeias de informações. Existem iterators para bancos de dados, XML e sistema de arquivos, é claro. O exemplo anterior, reescrito utilizando iterators, ficaria assim:

<?php
foreach (new DirectoryIterator('/tmp') as $arquivo)
{
    echo "$arquivo<br>\\n";
}
?>

O Iterator DirectoryIterator existe para se percorrer o sistema de arquivos e ele tem vários recursos adicionais, como filtros (FilterIterator), que permite exibir somente os resultados que satisfaçam o filtro.

O iterator é implementado sob a forma de uma classe que segue uma interface rígida. Podemos criar iterators para várias tarefas. Os iterators são parte do PHP5 e são providos pela extensão SPL (Standard PHP Library).

This entry was posted in PHP. Bookmark the permalink.

3 Responses to PHP: Percorrendo diretórios com SPL

  1. Walter Cruz says:

    Oi Pablo. Desde quando comecei a ler sobre PHP5, achei a SPL e os Iteradores de PHP5 uma ótima (mas um tanto quanto silenciosa) novidade.

  2. Teste says:

    teste

  3. Pingback: Percorrendo diretórios com PHP usando a SPL | Tas Blog: Tiago Silva

Leave a Reply

Your email address will not be published. Required fields are marked *