Palavra:   

Revista PHP / PHP

Flávia Jobstraibizer

Analista de sistemas, DBA Mysql, PostgreSQL, Oracle, SQLServer e Firebird. Desenvolvedora de sistemas, e administradora de servidores FreeBSD. Conheça o site www.flaviajobs.com.br

Listando arquivos e pastas de um diretório

Quando o assunto é manipulação de arquivos dentro de um servidor, muita coisa pode ser feita. Inclusive para os administradores, alguns scripts são realmente úteis, como o que vamos ver a seguir.

O script que vou apresentar, é uma forma prática de listar as pastas e arquivos de um diretório (diretório este, que deverá ser remoto, ou seja, online), mostrando visualmente o que é pasta, e o que é arquivo.
Facilidade esta, que pode ser adicionada à um script de download, envio por email, etc.

Vou trabalhar aqui, com algumas funções pouco utilizadas, ou melhor dizendo, pouco exploradas.
São elas:
getcwd: http://www.php.net/manual/pt_BR/function.getcwd.php
opendir: http://www.php.net/manual/pt_BR/function.opendir.php
readdir: http://www.php.net/manual/pt_BR/function.readdir.php
sort: http://www.php.net/manual/pt_BR/function.sort.php
is_dir: http://www.php.net/manual/pt_BR/function.is-dir.php

getcwd: obtém o diretório atual
opendir: abre o diretório informado no getcwd
readdir: lê o diretório abe rto

Então esta é a primeira parte:

<?php
// pega o endereço do diretório
$diretorio = getcwd();
// abre o diretório
$ponteiro = opendir($diretorio);
// monta os vetores com os itens encontrados na pasta
while ($nome_itens = readdir($ponteiro)) {
$itens[] = $nome_itens;
}

O que fizemos aqui, foi justamente, pegar o diretório, abri-lo e lê-lo.

Continuando, vamos usar:

sort: ordena os vetores (arrays), de acordo com os parâmetros informados. Aqui estou ordenando por pastas e depois arquivos
// ordena o vetor de itens
sort($itens); // percorre o vetor para fazer a separacao entre arquivos e pastas
foreach ($itens as $listar) { // retira "./" e "../" para que retorne apenas pastas e arquivos
if ($listar!="." && $listar!=".."){ // checa se o tipo de arquivo encontrado é uma pasta
if (is_dir($listar)) {
// caso VERDADEIRO adiciona o item à variável de pastas
$pastas[]=$listar;
} else{
// caso FALSO adiciona o item à variável de arquivos
$arquivos[]=$listar;
}
}
}

Vimos acima, a expressão is_dir, indicando que as ações devem esntão ser executadas, ali mesmo, no diretório que já foi aberto e lido. As ações que executamos ali, foram: ver se tem pastas, listar. Ver se tem arquivos, listar.

Agora, se houverem pastas, serão apresentadas antes dos arquivos, em odem alfabética.
Se não houverem, serão apresentados apenas os arquivos, na mesma ordem.
E se houverem os dois, serão mostrados igualmente.

// lista as pastas se houverem
if ($pastas != "" ) {
foreach($pastas as $listar){
print "Pasta: <a href='$listar'>$listar</a><br>";}
}
// lista os arquivos se houverem
if ($arquivos != "") {
foreach($arquivos as $listar){
print " Arquivo: <a href='$listar'>$listar</a><br>";}
} ?>

Para ver este script funcionando, clique aqui: http://www.flaviajobs.com.br/sistemas/revistaphp/listadir.php

O que você pode fazer, para melhorar um código como este: adicionar links às pastas e arquivos, podendo então fazer download, ou enviar um deles por email, por exemplo.
Também poderá adicionar um contador, para saber quantos arquivos tem, quantas pastas também.
Ou ainda: calcular o espaço que os arquivos estão tomando neste diretório, utilizando conjugadamente as funções filesize (ler tamanho do artigo) e disk_total_space (ver tamanho total do diretório) - Ambas funções, abordarei em outro artigo.

Opções de Interação

Comentários

ASSASSINOS!!
Por: asdf, 22/04/2011   23:16:42
Cristo pai jesus maria e jose! Um assassina a gramática(escluir??kkkk), o outro a paciência da gente("ai, o script é meu quero crédito!" "Não. E vai tomar na rabeta. tem nada seu aqui ô paspalho".) Mas q é engraçado a moçoila achar que esse script,mais básico impossível e que nao tem absolutamente NENHUMA novidade, pertence a ele, kkk. Filhote, a não ser que vc tenha inventado os comandos foreach if else while e print, falho em localizar a parte em que foi feita alguma criação. Tem dó, finge q vai cagar e sai de fininho, tá passando vergonha.
Observações
Por: Rubens, 15/11/2010   19:18:32
Flávia, uma observação em relação a linha:
"while ($nome_itens = readdir($ponteiro)) {"

Caso exista um arquivo u diretório chamado "0" (zero), ele será considerado falso pelo while e irá parar de percorrer os demais itens. Para evitar isso, o correto seria fazer assim:

"while (($nome_itens = readdir($ponteiro)) !== false) {"

E nestas linhas:
"if ($pastas != "" ) {"
"if ($arquivos != "") {"

O ideal seria inicializar o vetor $pastas e $arquivos, depois verificar se não está vazio com "empty".
Genial! Didático!
Por: Roberval, 09/09/2010   19:26:14
menina muiiiitíssimo obrigado pela aula! aprendi muito! e já aproveitei pra melhorar meu programinha!! Achei ótimo todos os comentários que vc colocou!

aos amigos que tbem 'incrementaram' com mais dicas.. só tenho mais agradecimentos! sem frescura sem pieguice! eu gostei mesmo!

[]s Sena
Usando iterators...
Por: Rogério, 23/07/2010   13:37:10
Você também pode listar os arquivos recursivamente usando iterators:

<a href="http://phpdive.com/como-listar-arquivos-de-diretorio-recursivamente-com-php.html" target="_blank">Como listar arquivos de diretório recursivamente com PHP</a>
E poderia ter também um BOTÃO UPLOAD
Por: José, 19/05/2010   18:04:04
Oi Flávia. Só pra completar a sujestão. Que tal você fazer um BOTÃO UPLOAD para enviar arquivos para um diretório.
Na verdade, isso seria um sisteminha bem completo. Acho que seria muito útil pra muita gente.
Eu estou precisando de algo assim.

Se caprichar, dá até pra aparecer as miniaturas das imagens na própria relação de arquivos.

Se não for pedir muito, gostaria que você fizesse algo nesse sentido.

Desde já fico muito grato.
Poderia ter um botão pra DELETAR . Que acham?...
Por: José, 19/05/2010   17:59:18
Olá Flávia. Gostei muito do seu artigo, e deixo aqui a minha sujestão para incluir um BOTÃO ESCLUIR ARQUIVO (uma foto, etc.)

Se você puder fazer essa adptação fico muito grato. Vou aguardar.
O tamanho do ego desse Cadu
Por: Mao, 26/01/2010   17:10:51
Quem precisa desse teu códigozinho tosco e mal feito?
Qualquer idiota consegue pegar os exemplos de tem no manual do php, traduzir. Já que você é o cara, por que não faz um exemplo bonito e bem feito?
Olha os exemplos que outras pessoas sem EGO disponibilizaram e ve se faz algo util em vez de ficar encomodando quem tem boa vontade:
http://php.net/manual/en/function.opendir.php
DEVERIA TER CITADO A FONTE.
Por: Cadu, 22/01/2010   16:53:19
Boa tarde, sou O AUTOR do script você deveria ter no minimo entrado em contato pedindo autorização para utilizar o script e ter citado meu nome.
POr gentileza inclua a fonte abaixo e informa minha autoria.

http://phpbrasil.com/script/L1UYlHIO-lXU/listar-arquivos-e-subpastas-de-uma-pasta.

Obrigado

Cadu
Listar diretorios
Por: Rivaldo, 10/11/2009   12:51:41
Boa tarde, sou novo aqui e preciso tirar uma duvuda, consegui listar diretorio com o seguinte codigo:
<?php
$dir = 'foto'; // diretório

foreach(new DirectoryIterator($dir) as $file){
echo "$file";
}
?>
Lista todo o conteudo, porem lista um "." e ".." antes dos diretorios a serem listados, Ex.: (. .. casa carro) alguem sabe me dizer o porque? Grato Rivaldo
olá joão
Por: CARLOS, 17/10/2009   20:20:20
para esconder o arquivo index.php é so vc incluir antes da linha:

print " Arquivo: <a href='$listar'>$listar</a><br>";}

o seguinte:

if($listar == "index.php"){
echo "";
}else{

testei aqui e deu certinho. vlw