Mostrando o Conteúdo de Pastas/Diretórios com PHP
outubro 5th, 2008 | by DragaO~ |yo happy people :D
hoje ensinarei (à quem nao sabe, logico :D) a manipulaçao de diretorios (diretorios, pra quem nao sabe, sao as “pastas”) utilizando PHP :D
o que ensinarei aqui hoje, vai ser fazer o PHP ler todo o conteudo de uma pasta/diretorio, e mostrar somente o desejado na tela ;)
a ideia eh muito basica e simples : mandar o PHP fazer o que fariamos
bom, pra começar, podemos pensar o seguinte, quando vamos buscar algum arquivo no nosso computador, nos entramos de pasta em pasta procurando por ele, e vemos o conteudo dessa pasta para ver se o que procuramos esta ali dentro
o script eh muito simples e sem problemas, como segue abaixo :
1 2 3 4 5 6 7 8 | //abrindo a nossa pasta/diretorio e armazendo isso em uma variavel $dir = opendir('caminho/para/pasta/que/queremos/abrir/ou/acessar'); //lendo todo o conteudo do diretorio que abrimos/acessamos while(($arquivo = readdir($dir)) !== false) { echo $arquivo."<br />"; } |
explicando o codigo :
2 | $dir = opendir('caminho/para/pasta/que/queremos/abrir/ou/acessar'); |
simplesmente estamos mandando o PHP abrir a pasta que queremos e armazenar o identificador dele em uma variavel, para que posteriormente possamos manipular esta pasta (no nosso caso, ler o conteudo)
obs : o caminho pode ser relativo ou absoluto, o PHP aceita ambos, mas lembrem-se que a pasta deve existir, caso contrario o PHP retornara um “warning”
5 | while(($arquivo = readdir($dir)) !== false) |
a parte mais dificil de compreender XD
vamos por partes :
1. a funçao “readdir()” le o conteudo de um diretorio previamente aberto pela funçao “opendir()”
2. a variavel “$arquivo” vai receber o retorno da funçao “readdir()” (ou seja, o nome de um dos arquivos existente naquela pasta)
3. no caso de nao existir arquivo algum dentro daquela pasta, a funçao “readdir()” retorna “false”, logo, o valor da nossa variavel “$arquivo” (no momento em que nao existir mais arquivo algum na pasta), sera “false” (ok, nao necessariamente sera “false”, pode ser uma string vazia ou o numero inteiro “0″ (zero), mas em todos casos isso eh interpretado como “não-true”, ou seja, “false”)
4. o “while” faz com que leia todo o conteudo da pasta, pois sem ele, apenas nos sera mostrado um arquivo de dentro da pasta
resumindo : esse laço eh o reponsavel pela leitura da pasta ;D
7 | echo $arquivo."<br />"; |
aqui mostramos o conteudo atual da variavel “$arquivo”, ou seja, o nome de um dos arquivos de dentro de nossa pasta
sei que algumas pessoas tem duvidas ou ateh mesmo dificuldades em relaçao à manipulaçao de diretorios, mas o que eu quis mostrar neste mini-mini-mini-mini-tutorial (XD) foi que eh bem simples e nem um pouco confuso ^^
claro que podemos melhorar ainda mais isso, como, por exemplo, mostrar apenas os arquivos que possuam extensao “jpg” :
1 2 3 4 5 6 7 8 9 10 11 12 13 | //abrindo a nossa pasta/diretorio e armazendo isso em uma variavel $dir = opendir('pasta/com/imagens'); //lendo todo o conteudo do diretorio que abrimos/acessamos while(($arquivo = readdir($dir)) !== false) { //coisa nova aqui :D //verificando se a extensao eh ".jpg" if(strrchr(strtolower($arquivo), ".") == ".jpg") { echo $arquivo."<br />"; } } |
bom, me aterei apenas as mudanças, ok ? ;D
9 | if(strrchr(strtolower($arquivo), ".") == ".jpg") |
novamente, explicarei por partes ;D
1. a funçao “strtolower()” converte uma string para minusculas; utilizamos ela ali pois nao sabemos como a extensao do arquivo vai estar (ele pode ser “JPG”, “JpG”, “jPG”, etc; mas em todos casos nos iremos querer mostrar eles, nao eh mesmo ? ;))
2. a funçao “strrchr()” retorna a ultima ocorrencia do que queremos da nossa string. para melhor “entendimento”, recomendo a leitura da definiçao da funçao “strrchr()” no proprio php.net caso eu nao tenha sido muito claro ;)
entendendo o “if” : “se o que vier apos o ultimo ponto do nome de meu arquivo for “jpg”, sem considerar maiusculas e minusculas faça os comandos a seguir”
espero ter sido claro com essa ultima explicaçao ^^
bom, mais um “misterio” desvendado ;D
referencia das funçoes :
opendir(), readdir(), strrchr(), strtolower()
problemas, duvidas ou bugs, favor reportar ;)
flw xD/
6 Responses to “Mostrando o Conteúdo de Pastas/Diretórios com PHP”
By Claiton Padilha on out 7, 2008 | Reply
Muito bacana….
Realmente foi pratico, rapido e objetivo.
É isso aí…
:D
Quote
By Marcelo on dez 18, 2008 | Reply
muito massa \o/
mas não ficaria mais simples de entender se fosse:
while(($arquivo = readdir($dir)) == true)
?
não seria uma negação da negação oO
e sim, enquanto tal for verdadeiro
ah, parabéns pelo blog o/
tudo realmente bem explicado
fuis
Quote
By DragaO~ on dez 18, 2008 | Reply
tambem poderia ser :D
lembre-se : sempre existem “n” formas de se fazer a mesma coisa ;D
e eu pus isso, pq eu quis fazer parecido com o php.net nessa parte de manipulaçao de diretorios, para caso alguem consulte o manual, fique mais facil de compreender
obrigado pelo comentario :D
Quote
By Julio Cesar on jan 10, 2009 | Reply
Resumindo pode ser assim tb…
<?php
foreach(array_merger(glob(”*.jpg”),glob(”*.JPG”),glob(”*.jpeg”),glob(”*.JPEG”),glob(”*.gif”),glob(”*.GIF”))as $arquivo){
echo “”;
}
?>
Quote
By DragaO~ on jan 11, 2009 | Reply
Primeiramente, obrigado pelo comentário :D
bom, realmente eu nao conhecia a função “glob()”, porém notei alguns problemas :
muitas extensões fica problemático, pois pode ser que no servidor tenha imagens no formato “png”, “PNG”, “PnG”, “Png”, etc; já ficaria muito custoso ficar colocando cada uma das possibilidades (no meu código apenas o “strtolower” bastou, utilizando a função “glob” eu não consegui o mesmo resultado)
pra isso funcionar, as imagens e o script devem estar na mesma pasta/diretório (se for possível fazer em qualquer pasta, peço que explique, pois realmente não achei nenhuma maneira)
adicionalmente, fiquei curioso e fiz váááááários testes de velocidade entre nossos scripts
no último teste, tanto o meu script quanto o teu reconheciam apenas as extensões “PNG” e “png” e mostravam ordenado ao final da execução
nos testes que realizei aqui, o meu script, apesar de ser maior e utilizar mais funções, foi 9 ms mais rápido (que coisa nerd não?)
mas é claro, você (e nem ninguém) precisa acreditar :D
mas realmente é uma solução interessante caso se saiba as possíveis extensões, diminuiu bastante o tamanho do código
e mais uma vez, obrigado pelo comentário, pois além de receber o comentário ainda aprendi algo novo :D
bem-vindo ao meu blog e volte sempre
Quote