Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

luan_alves

Listar diretorios e subdiretorios , com metodo recursivo

Recommended Posts

Boa noite á todos,

 

Estou tendo um grande problema.

 

 

Preciso listar todos os diretorios e subdiretorios. Criei um método recursivo onde obtenho as respostas que eu solicito, porém o problema é que, como o método é recursivo, o outro método que faz o chama, recebe o retorno do primeiro looping. Assim eu só obtenho a primeira camada das pastas.

 

Abaixo esta o exemplo que estou utilizando.

 

public function eliminaImagem() {
        $testes =$this->ScanDirectory(info::diretorioUpload());
        var_dump($testes);
    }

    private function ScanDirectory($Directory,$diretorios=array()) {
        if(!empty($diretorios)){
            $diretorios = array_combine($diretorios, $diretorios);
        }
        $MyDirectory = new DirectoryIterator($Directory);
        foreach ($MyDirectory as $file) {
            // verifica se o valor de $file é diferente de '.' ou '..'
            // e é um diretório (isDir)
            if (!$file->isDot() && $file->isDir()) {
                // file_exists($filename);
                // atribuição a variável $dname
                $dname = $Directory . '/' . $file->getFilename();
                $dname = str_replace('//', '/', $dname);
                // imprime o nome do diretório
              //  echo $dname . "<br />";
                $diretorios[] = $dname;
                $this->ScanDirectory($dname,$diretorios);
            }
        }
        //$diretorios = array_combine($diretorios, $diretorios);
        return $diretorios;
    }

 

É para retornar isso

C:/wamp/www/aplication/app/up/anuncio
C:/wamp/www/aplication/app/up/anuncio/files
C:/wamp/www/aplication/app/up/anuncio/grande
C:/wamp/www/aplication/app/up/anuncio/medio
C:/wamp/www/aplication/app/up/anuncio/pequena
C:/wamp/www/aplication/app/up/arquivos
C:/wamp/www/aplication/app/up/facebook
C:/wamp/www/aplication/app/up/files
C:/wamp/www/aplication/app/up/files/crop
C:/wamp/www/aplication/app/up/thumbs
C:/wamp/www/aplication/app/up/thumbs/files

Esta retornando, só a primeira camada de pastas
array (size=5)
  0 => string 'C:/wamp/www/aplication/app/up/anuncio' 
  1 => string 'C:/wamp/www/aplication/app/up/arquivos' 
  2 => string 'C:/wamp/www/aplication/app/up/facebook'
  3 => string 'C:/wamp/www/aplication/app/up/files' 
  4 => string 'C:/wamp/www/aplication/app/up/thumbs'

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés de fazer tudo isso você pode utilizar as próprias classes de recursividade de diretórios do PHP.

$path = "/caminho/do/meu/diretorio";
$dirsIterator = new RecursiveTreeIterator(new RecursiveDirectoryIterator($path));
$dirs = array();

foreach ($dirsIterator as $dir => $dirTree) {
    if (is_dir($dir)) {
        $dirs[] = $dir;
    }
}

var_dump($dirs);

Não encontrei uma forma de retornar o diretório em objeto por isso usei a função is_dir() para verificar se é diretório.

 

Obs.: Não sei qual é o objetivo disso, mas tome cuidado ao utilizar esse tipo de recurso porque na verdade o que ele está fazendo nada mais é que listando todos os diretórios e arquivos do próprio diretório e subdiretórios e fazendo um filtro. Portando jamais faça isso no diretório raiz da sua aplicação ou em diretórios com muitos arquivos e níveis, pois consumirá absurdo processamento e tempo. Se você está querendo fazer isso é porque há algo mal planejado em sua aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés de fazer tudo isso você pode utilizar as próprias classes de recursividade de diretórios do PHP.

$path = "/caminho/do/meu/diretorio";
$dirsIterator = new RecursiveTreeIterator(new RecursiveDirectoryIterator($path));
$dirs = array();

foreach ($dirsIterator as $dir => $dirTree) {
    if (is_dir($dir)) {
        $dirs[] = $dir;
    }
}

var_dump($dirs);

Não encontrei uma forma de retornar o diretório em objeto por isso usei a função is_dir() para verificar se é diretório.

 

Obs.: Não sei qual é o objetivo disso, mas tome cuidado ao utilizar esse tipo de recurso porque na verdade o que ele está fazendo nada mais é que listando todos os diretórios e arquivos do próprio diretório e subdiretórios e fazendo um filtro. Portando jamais faça isso no diretório raiz da sua aplicação ou em diretórios com muitos arquivos e níveis, pois consumirá absurdo processamento e tempo. Se você está querendo fazer isso é porque há algo mal planejado em sua aplicação.

 

Eu já havia tentado desta forma, e da o mesmo resultado. Nós temos 3 níveis de sub-diretórios, e desta forma é listado apenas o primeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você testou o código? Pois eu testei quando escrevi e funcionou perfeitamente aqui. :yes:

 

Tenho a seguinte estrutura de diretórios:

/veiculos
    /carros
        /sedan
        /compacto
    /caminhoes
    /motos

 

Executando o script passando o caminho de /veiculos a saída foi:

array(5) {
  [0]=> string(59) "C:\veiculos\caminhoes"
  [1]=> string(56) "C:\veiculos\carros"
  [2]=> string(65) "C:\veiculos\carros\compacto"
  [3]=> string(62) "C:\veiculos\carros\sedan"
  [4]=> string(55) "C:\veiculos\motos"
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você testou o código? Pois eu testei quando escrevi e funcionou perfeitamente aqui. :yes:

 

Tenho a seguinte estrutura de diretórios:

/veiculos
    /carros
        /sedan
        /compacto
    /caminhoes
    /motos

 

Executando o script passando o caminho de /veiculos a saída foi:

array(5) {
  [0]=> string(59) "C:\veiculos\caminhoes"
  [1]=> string(56) "C:\veiculos\carros"
  [2]=> string(65) "C:\veiculos\carros\compacto"
  [3]=> string(62) "C:\veiculos\carros\sedan"
  [4]=> string(55) "C:\veiculos\motos"
}

 

marcielo bom dia,

 

Cara devo ter feito algo diferente, porque da forma como você fez funcionou.

Obrigado.

 

E a utilização é simples, nosso aplicação poderá gerar lixo de uploads, então a ideia é listar os arquivos de um determinado diretorio, valida-los na base e caso os mesmos não estejam na base, então iremos fazer a varredura nos diretórios e sub-diretórios em busca das cópias destes arquivos e elimina-los .

 

Mais uma vez obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés de fazer tudo isso você pode utilizar as próprias classes de recursividade de diretórios do PHP.

$path = "/caminho/do/meu/diretorio";
$dirsIterator = new RecursiveTreeIterator(new RecursiveDirectoryIterator($path));
$dirs = array();

foreach ($dirsIterator as $dir => $dirTree) {
    if (is_dir($dir)) {
        $dirs[] = $dir;
    }
}

var_dump($dirs);

Não encontrei uma forma de retornar o diretório em objeto por isso usei a função is_dir() para verificar se é diretório.

 

Obs.: Não sei qual é o objetivo disso, mas tome cuidado ao utilizar esse tipo de recurso porque na verdade o que ele está fazendo nada mais é que listando todos os diretórios e arquivos do próprio diretório e subdiretórios e fazendo um filtro. Portando jamais faça isso no diretório raiz da sua aplicação ou em diretórios com muitos arquivos e níveis, pois consumirá absurdo processamento e tempo. Se você está querendo fazer isso é porque há algo mal planejado em sua aplicação.

Obrigado Marcielo estava com o mesmo problema sua rotina me ajudou muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.