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

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
Nossa!! Muito bom mesmo.
Por: Alexandro, 02/12/2008   14:46:17
O Script é ótimo.
Gostaria de saber como faço para ele ler em outro diretório?
Mais uma sugestão
Por: Manuel, 22/10/2008   17:50:41
Aqui mais uma dica para mostrar o tamanho do arquivo:

Onde está:

foreach($arquivos as $listar){
print " Arquivo: <a href='$listar'>$listar</a><br>";}
}

Altere para:

foreach($arquivos as $listar){
$tamanho = round(filesize($diretorio.$listar)/1024);
print " Arquivo: <a href='$listar'>$listar</a> ($tamanho Kb)<br>";}
}

E seguindo a dica do Carlos, em vez de escrever todas a extensões permitidas na liastagem, escreva apenas as não permitidas, como "html" ou "php" e mude a linha

if (in_array(strtolower(end(explode(".",$listar))), $tipos)) { $arquivos[]=$listar; }

para

if (in_array(strtolower(end(explode(".",$listar))), $tipos)) {
} else { $arquivos[]=$listar; };

Boa sorte com seu script!
Muito bom seu artigo
Por: Carlos, 09/10/2008   23:10:45
Só gostaria de deixar uma dica bacana para este seu script.
adicione antes da primeira linha do script um array como este:
$tipos = array("jpg", "jpe", "jpeg", "gif", "png");
Obs.: escreva as extensões em letras minusculas.

e altere a seguinte linha
$arquivos[]=$listar;

para
if (in_array(strtolower(end(explode(".",$listar))), $tipos)) { $arquivos[]=$listar; }

caso queira controlar os tipos de arquivos a serem exibidos na listagem

;)
ótimo artigo...
Por: Cauê, 18/04/2008   11:55:14
muito obrigado por ser tão clara e específica no seu artigo.. consegui adapatá-lo perfeitamente para o que eu precisava..

realmente grato..

Cauê Gonzalez
Listando Diretório
Por: Hugo, 11/01/2008   07:38:43
Olá Flávia, muito bom o artigo. Olha criei conforme o que você explicou no texto e funcionou direitinho mas apareceu um caracter muito estranho! é esse ai "" não entendo pq ele aparece! Já busquei algo na internet e não consegui soluções. Se puder me ajudar ficarei grato.
Como Pesquisar arquivos no diretorio com mascara ?
Por: Flávio, 03/01/2008   12:46:56
Olá Flávia, boa tarde, adorei seu artigo me ajduou muito em meu sistema, porem estou com um problema, preciso pesquisar esses arquivos por determinados nomes, pra que eu monte um historico dos mesmos, como posso fazer isso utilizando mascara ?

Atenciosamente

Flávio Alexandrd