De volta ao PHP (de novo e outra vez).
Dessa vez eu precisei de uma função que me listasse todos os arquivos e diretórios de um determinado caminho.
De cara eu encontrei o scandir. Só que ele listaria apenas a primeira “camada” de arquivos.
Quero mais!
Queria uma função que me permitisse ver todos os arquivos e pastas presentes num diretório, entrando em cada pasta existente desde a raiz. Por ex:
- Pasta BLA
- Arquivo.php
- imagem.jpg
- Nova Pasta
- readme.txt
- formatacao.css
Usar o scandir só me listou os nomes das pastas e não os arquivos dentro dela.
Então faça!
O algoritmo é simples:
- Pegar todos os arquivos de um caminho
- Jogar para um array
- Verificar se algum dos itens do array é uma pasta
- Se for, criar um array para a nova pasta
- Chamar a função recursivamente para preencher o array com os arquivos e pastas
Quando chamamos o scandir, seguindo a estrutura apresentada de pastas apresentadas antes, teremos um array com os seguintes dados:
[0]Arquivo.php (string)
[1]imagem.jpg (string)
[2]Nova Pasta (string)
[3]Outra Pasta (string)
Como “Nova Pasta” e “Outra Pasta” são pastas (DUH), elas podem conter N itens dentro delas, por isso transformamos o item num array.
Chamamos a função recursivamente pois já temos o comportamento da função pronto (pegue os arquivos e retorne), só não sabemos quantas pastas encontraremos no caminho.
Se ela não for chamada recursivamente, apenas encontraremos um nível de pastas abaixo da inicial.
Hora do código!
Aqui vai…
function GetDirectoriesAndFiles($dirPath)
{
//pega todos os arquivos e pastas do diretório
$files = scandir($dirPath);
//vamos olhar em um por um
foreach ($files as $key => $file)
{
//se for a pasta ou diretório corrente,
//remova e pule pra próxima
if ($file == '..' || $file == '.')
{
unset($files[$key]);
continue;
}
//diretório + arquivo atual
$currentDirPath = $dirPath."\\".$file;
//vendo se é um diretorio
//se for, precisamos pegar os arquivos e pastas dele tbem
if(is_dir($currentDirPath))
{
//lembrando do nome atual
$dirName = $file;
//transforma em array (primeiro item é o nome do dir)
$file = array($dirName);
//pegando todos os arquivos e pastas nele... (recursivo)
$file[] = GetDirectoriesAndFiles($currentDirPath);
//destrói o item original do array
unset ($files[$key]);
//coloca o novo array no lugar,
//com os arquivos e pastas encontrados
$files[$key] = $file;
}
}
return $files;
}
Para testar você pode colocar essa função num arquivo que tenha pastas no mesmo nível e rodar. Ex:
echo "<pre>";
echo print_r(GetDirectoriesAndFiles(__DIR__));
echo "</pre>";
É isso! Agora você decide o que fazer com o conteúdo do array. Qualquer coisa, basta mandar um comentário.
Passa a régua e fecha a conta!
Até mais.
