PHP

PHP: Listando diretórios, subdiretórios, arquivos etc

Atualizado em 08/02/2017.


A partir da versão 5 do PHP pode-se utilizar um construtor muito útil para listar diretórios, subdiretórios, arquivos etc.

Este construtor chama-se “DirectoryIterator“.

/xampp
  / htdocs
    / sistema
      / fotos (diretório principal)
         / foto1.jpg
         / foto2.jpg
         / produtos (subdiretório)
              / produto1.jpg
              / produto2.jpg
         / albuns (subdiretório)
              / album1.jpg
              / album2.jpg

Veja como utilizá-lo:

<?php
// linux
$dir = new DirectoryIterator( '/www/sistema/fotos/' );
// windows
//$dir = new DirectoryIterator( 'c:/xampp/htdocs/sistema/fotos/' );
 
// array contendo os diretórios permitidos    
$diretoriosPermitidos = array("albuns");
 
foreach($dir as $file)
{
    // verifica se $file é diferente de '.' ou '..'
    if (!$file->isDot())
    {
        // listando somente os diretórios
        if  ( $file->isDir() )
        {
            // atribui o nome do diretório a variável
            $dirName = $file->getFilename();
 
            // listando somente o diretório permitido
            if( in_array($dirName, $diretoriosPermitidos)) {
                // subdiretórios
                $caminho = $file->getPathname();
                // chamada da função de recursividade
                recursivo($caminho, $dirName);
            }
        }
 
        // listando somente os arquivos do diretório
        if  ( $file->isFile() )
        {
            // atribui o nome do arquivo a variável
            $fileName = $file->getFilename();
            //
            echo "fotos: ".$fileName."<br>";
        }
    }
}
 
function recursivo( $caminho, $dirName ){
 
    global $dirName;
 
    $DI = new DirectoryIterator( $caminho );
 
    foreach ($DI as $file){
        if (!$file->isDot())
        {
            if  ( $file->isFile() )
            {
                //
                $fileName = $file->getFilename();
                //
                echo $dirName.": ".$fileName."<br>";
            }
        }
 
    }
}
?>

Detalhes:
DirectoryIterator::__construct — Constrói um novo iterador de diretório a partir de um caminho
DirectoryIterator::current — Retorna $this (necessário para a interface Iterator)
DirectoryIterator::getATime — Retorna a data de último acesso do arquivo
DirectoryIterator::getCTime — Retorna a data de modificação do inode do arquivo
DirectoryIterator::getFilename — Retorna o nome do arquivo do elemento atual do diretório
DirectoryIterator::getGroup — Retorna o grupo do arquivo
DirectoryIterator::getInode — Retorna o inode do arquivo
DirectoryIterator::getMTime — Retorna a data da última modificação do arquivo
DirectoryIterator::getOwner — Retorna o proprietário do arquivo
DirectoryIterator::getPath — Retorna o caminho do diretório
DirectoryIterator::getPathname — Retorna o caminho e o nome do arquivo atual do diretório
DirectoryIterator::getPerms — Retorna as permissões do arquivo
DirectoryIterator::getSize — Retorna o tamanho do arquivo
DirectoryIterator::getType — Retorna o tipo do arquivo
DirectoryIterator::isDir — Retorna true se o elemento atual é um diretório
DirectoryIterator::isDot — Retorna true se o elemento atual for ‘.’ ou ‘..’
DirectoryIterator::isExecutable — Retorna true se o arquivo for executável
DirectoryIterator::isFile — Retorna true se o elemento atual for um arquivo
DirectoryIterator::isLink — Retorna true se o elemento atual for um link simbólico
DirectoryIterator::isReadable — Retorna true se o arquivo pode ser lido
DirectoryIterator::isWritable — Retorna true se o arquivo pode ser modificado
DirectoryIterator::key — Retorna o elemento atual do diretório
DirectoryIterator::next — Avança para o próximo elemento
DirectoryIterator::rewind — Recomeça a iteração do diretório
DirectoryIterator::valid — Verifica se o diretório possui ou não mais elementos

5 thoughts on “PHP: Listando diretórios, subdiretórios, arquivos etc

  • vicente

    Muito bom o tutorial, vlw mesmo.

    Só uma duvida como eu poderia colocar um filtro pra só aparecer os diretórios que eu quiser?

    Resposta
    • Fala Vicente.

      O script foi atualizado mostrando como filtrar os diretórios.

      Abraço

      Resposta
  • Moises

    Muito bom o tutorial, me ajudou bastante.

    Uma dúvida como eu posso ver todos os arquivos independente do diretórios ou sub-diretorio?
    Exemplo: Diretorio Raiz (arquivo) – Sub-diretorio (arquivo) .

    Gostaria só de configurar o diretorio raiz, para que ele buscasse todos os arquivos , independente se tivesse 3 ou 4 nives de diretorios.

    Resposta
    • Fala Moises,

      Fiz uma pequena modificação no código:

      </php
      foreach($dir as $file)
      {
          // verifica se $file é diferente de '.' ou '..'
          if (!$file->isDot())
          {
              // listando somente os diretórios
              if  ( $file->isDir() )
              {
                  // atribui o nome do diretório a variável
                  $dirName = $file->getFilename();
       
                  // subdiretórios
                  $caminho = $file->getPathname();
                  // chamada da função de recursividade
                  recursivo($caminho, $dirName);
              }
       
              // listando somente os arquivos do diretório
              if  ( $file->isFile() )
              {
                  // atribui o nome do arquivo a variável
                  $fileName = $file->getFilename();
                  // print
                  echo "Arquivos: ".$fileName."<br>";
              }
          }
      }
       
      function recursivo( $caminho, $dirName ){
       
          global $dirName;
       
          $DI = new DirectoryIterator( $caminho );
       
          foreach ($DI as $file){
              if (!$file->isDot())
              {
                  if  ( $file->isFile() )
                  {
                      //
                      $fileName = $file->getFilename();
                      //
                      echo $dirName.": ".$fileName."<br>";
                  }
              }
       
          }
      }
      ?>
      Resposta

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *