Listando arquivos com PHP
Neste artigo vamos ver como listar arquivos de uma pasta utilizando PHP. Você vai ver como é possível listar o nome do arquivo, extensão, tamanho e data de criação.
Para todos os exemplos, se supõe que existe uma pasta chamada "meus_arquivos" dentro do mesmo local onde você vai executar o seu script PHP.
O que você vai aprender neste artigo?
* Listar arquivos utilizando DIR
* Listar arquivos utilizando SCANDIR
* Listar arquivos utilizando OPENDIR
* Listar arquivos utilizando DirectoryIterator
* Listar arquivos utilizando GLOB
* Métodos para trabalhar com DirectoryIterator
* Filtar os resultados por tipo de extensão de arquivos
* Ler pastas e subpastas
Listar arquivos utilizando DIR
A forma mais simples de listar o conteúdo de uma pasta é utilizando a função dir(). Ela recebe como parâmetro o caminho da pasta.
$pasta = "meus_arquivos";
$diretorio = dir($pasta);
while(($arquivo = $diretorio->read()) !== false) {
echo $arquivo."<br>";
}
$diretorio->close();
A função dir() retorna uma instância do objeto Directory. Ele possui 3 métodos, read(), rewind(), e close(). Utilizando um WHILE, utilizamos o método read para iterar pelos resultados. O código acima vai retornar o nome dos arquivos da pasta.
Perceba que no código acima a lista começou com "." e o segundo item era "..". O "." representa o diretório atual e o ".." representa o diretório pai.
Listar arquivos utilizando SCANDIR
Você também pode ler arquivos de uma pasta utilizando a função scandir().
$pasta = "meus_arquivos";
$arquivos = scandir($pasta);
foreach ($arquivos as $arquivo) {
echo $arquivo . "<br>";
}
Scandir possui 3 parâmetros, o primeiro é obrigatório, que é o caminho da pasta, os outros dois são opcionais. O segundo parâmetro é o modo de ordenação, por padrão é em ordem ascendente, e o último é o contexto.
Listar arquivos utilizando OPENDIR
Uma outra forma de ler arquivos de uma pasta é utilizar a função opendir()
$pasta = "meus_arquivos";
if ($handle = opendir($pasta) ) {
while ($arquivo = readdir( $handle ) ) {
echo $arquivo . "<br>";
}
closedir($handle);
}
No codigo acima, se houver retorno da função opendir(), fazemos um while. Perceba que para ler cada item foi necessário utilizar a função readdir() para ler o item atual. Depois de feita a iteração, encerramos a leitura utilizando o método closedir()
O opendir possui os métodos closedir(), readdir() e rewinddir() para trabalhar com os arquivos retornados.
Listar arquivos utilizando DirectoryIterator
Uma outra forma de ler arquivos de uma pasta é utilizar o DirectoryIterator. A classe DirectoryIterator fornece uma interface simples para visualização de conteúdo de diretórios de arquivos.
$pasta = "meus_arquivos";
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
echo $fileInfo->getFilename() . "<br>";
}
O método getFilename() retorna o nome do arquivo que está sendo iterado pelo foreach.
O DirectoryIterator fornece um conjunto de métodos para trabalhar com os arquivos, alguns deles vamos ver em alguns exemplos que serão mostrados durante este artigo.
Listar arquivos utilizando GLOB
Para concluir, você também pode utilizar Glob() para listar os arquivos de uma pasta. Glob retorna um array de acordo com um padrão informado.
$pasta = "meus_arquivos";
foreach (glob("$pasta/*.*") as $arquivo) {
echo $arquivo . "<br>";
}
Perceba que ao contrário dos exemplos anteriores, neste exemplo se está imprimindo o nome da pasta antes do nome do arquivo. Podemos ajustar o resultado para ficar igual aos testes anteriores fazendo o seguinte ajuste em nosso código:
$pasta = "meus_arquivos";
chdir($pasta);
foreach (glob("*.*") as $arquivo) {
echo $arquivo . "<br>";
}
A função chdir() muda o diretório atual.
Métodos para trabalhar com DirectoryIterator
Nos exemplos a seguir vamos trabalhar com o DirectoryIterator e ver alguns métodos disponíveis para trabalhar com arquivos.
Para retornar o tamanho do arquivo podemos utilizar o método getSize().
$pasta = "meus_arquivos";
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
echo $fileInfo->getFilename() . " " . $fileInfo->getSize() . "<br>";
}
O retorno é um número inteiro representando o tamanho do arquivo em bytes.
Observaçâo: Caso você queira saber o tamanho de um arquivo sem utilizar o DirectoryIterator, você pode utilizar a função filesize(). Ela recebe como parâmetro o caminho do arquivo.
Para retornar a extensão do arquivo você pode utilizar o método getExtension().
$pasta = "meus_arquivos";
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
echo $fileInfo->getFilename() . " " . $fileInfo->getExtension() . "<br>";
}
E para retornar a data de criação do arquivo você pode utilizar o método getMTime()
$pasta = "meus_arquivos";
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
echo $fileInfo->getFilename() . " " . $fileInfo->getMTime() . "<br>";
}
O retorno é um UNIX timestamp. Será necessário utilizar a função date() para formatar esta data
$pasta = "meus_arquivos";
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
echo $fileInfo->getFilename() . " " . date("d/m/Y", $fileInfo->getMTime()) . "<br>";
}
Filtar os resultados por tipo de extensão de arquivos
A seguir vamos ver exemplos de como filtrar os resultados por tipo de extensão de arquivos.
Nos exemplos a seguir vamos ver como fazer isso utilizando GLOB, OPENDIR e DIRETORY ITERATOR. Em ambos os exemplos, vamos retornar nome e extensão do arquivo. As extensões que serão filtradas serão PNG, JPG e GIF.
Começando pelo GLOB:
$pasta = "meus_arquivos";
chdir($pasta);
$arquivos = glob("{*.png,*.jpg,*.gif}", GLOB_BRACE);
foreach($arquivos as $arquivo) {
$extensao = strtolower( pathinfo($arquivo, PATHINFO_EXTENSION));
echo $arquivo . " - extensão:" . $extensao . "<br>";
}
Para obter a extensão utilizamos a função pathinfo(). Seu primeiro parâmetro é o caminho do arquivo, o segundo é uma flag que define qual o retorno desejado, em nosso caso PATHINFO_EXTENSION retorna a extensão. As outras flags que podem ser utilizadas são PATHINFO_DIRNAME, PATHINFO_BASENAME e PATHINFO_FILENAME.
A função strlower() foi utilizada para converter a extensão em letras minúsculas.
Agora vamos ver o mesmo exemplo utilizando OPENDIR:
$pasta = "meus_arquivos";
$extensoes_validas = array( 'png', 'jpg', 'gif' );
if ( $handle = opendir($pasta)){
while ( $arquivo = readdir( $handle ) ) {
$extensao = strtolower( pathinfo( $arquivo, PATHINFO_EXTENSION) );
if( in_array( $extensao, $extensoes_validas ) ) {
echo $arquivo . " - extensão:" . $extensao . "<br>";
}
}
closedir($handle);
}
A forma como a extensão foi obtida é igual ao do exemplo anterior. No exemplo anterior, onde usamos glob, foi informado um padrão. Como o opendir não trabalha com padrões, foi utilizado um if para filtrar os resultados. Foi criado um array com as extensões válidas, e utilizada a função in_array() para verificar se a extensão do arquivo existe no array de extensões válidas.
Para concluir, vamos fazer o mesmo exemplo utilizado DirectoryIterator
$pasta = "meus_arquivos";
$extensoes_validas = array( 'png', 'jpg', 'gif' );
$dir = new DirectoryIterator($pasta);
foreach ($dir as $fileInfo) {
$extensao = strtolower($fileInfo->getExtension() );
if( in_array($extensao, $extensoes_validas )){
echo $fileInfo->getFilename() . " - extensão:" . $extensao . "<br>";
}
}
Como o DirectoryIterator tem um método que retorna a extensão não foi necessário utilizar a função pathinfo().
Ler pastas e subpastas
Para concluir este artigo vamos ver um exemplo um pouco mais sofisticado. Nos exemplos anteriores fizemos a leitura de arquivos de uma pasta. Mas, se esta pasta tiver outras pastas, a leitura destas subpastas não vai ocorrer. Vamos ver a seguir como fazer a leitura de uma pasta e de todas as suas subpastas.
O retorno que vamos ter será um array com o caminho dos arquivos.
Neste primeiro exemplo vamos utilizar SCANDIR
$resultados = array();
$pasta = "meus_arquivos";
$arquivos = scandir($pasta);
foreach ($arquivos as $chave => $valor) {
$caminho = realpath($pasta . DIRECTORY_SEPARATOR . $valor);
if (!is_dir($caminho)) {
$resultados[] = $caminho;
} else if ($valor != "." && $valor != "..") {
getDirContents($caminho, $resultados);
$resultados[] = $caminho;
}
}
print_r($resultados);
A função realpath() retorna o caminho físico da pasta informada. A função is_dir() retorna true se o caminho informado for de uma pasta.
E para encerrar o artigo, faremos o mesmo utiilzando RecursiveIteratorIterator
$resultados = array();
$pasta = "meus_arquivos";
$arquivos = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pasta));
foreach ($arquivos as $arquivo) {
if ($arquivo->isDir()){
continue;
}
$resultados[] = $arquivo->getPathname();
}
print_r($resultados);