Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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'>
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.
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"
}>
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.
>
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.
Ao invés de fazer tudo isso você pode utilizar as próprias classes de recursividade de diretórios do PHP.
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.