2010-11-17 23 views
98

Estoy buscando un script PHP que recorra todos los archivos en un directorio para que pueda hacer cosas con el nombre del archivo, como el formato, imprimir o agregarlo a un enlace. Me gustaría poder ordenar los archivos por nombre, tipo o fecha de creación/agregado/modificación. (Piense en el "índice" de directorio de lujo). También me gustaría poder agregar exclusiones a la lista de archivos, como el script en sí u otros archivos del "sistema". (Como los . y .. "directorios".)Script PHP para recorrer todos los archivos en un directorio?

Siendo que me gustaría poder modificar el script, estoy más interesado en mirar los documentos de PHP y aprender a escribir uno yo mismo. Dicho esto, si hay guiones, tutoriales y otras cosas, por favor avíseme.

+0

http://stackoverflow.com/questions/1086105/ get-the-files-inside-a-directory/1086110 # 1086110 – zloctb

Respuesta

185

Puede utilizar el DirectoryIterator. Ejemplo de Manual php:

<?php 
$dir = new DirectoryIterator(dirname(__FILE__)); 
foreach ($dir as $fileinfo) { 
    if (!$fileinfo->isDot()) { 
     var_dump($fileinfo->getFilename()); 
    } 
} 
?> 
+3

Nota: muchos servidores no tienen SPL instalado, por lo que no podrá usar el Di clase rectorIterator (ver mi publicación alternativa a continuación). ¡Usa esto si puedes! – NexusRex

+1

Nota [2]: asegúrese de comprender que la función '' dirname() '' anterior obtendrá la carpeta principal de cualquier ruta que ponga ahí. En mi caso, asumí que dirname era un contenedor para el nombre/ruta del directorio, por lo que no era necesario. – willdanceforfun

+0

Además, si dirname es un gran sistema de archivos, los problemas con la memoria son evidentes. En mi caso con 1 millón de archivos, la aplicación necesita ~ 512M de RAM en memory_limit. – abkrim

14

utilizar la función scandir():

<?php 
    $directory = '/path/to/files'; 

    if (! is_dir($directory)) { 
     exit('Invalid diretory path'); 
    } 

    $files = array(); 

    foreach (scandir($directory) as $file) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     $files[] = $file; 
    } 

    var_dump($files); 
?> 
2

glob() tiene disposiciones para la clasificación y la coincidencia de patrones. Dado que el valor de retorno es una matriz, puede hacer casi todo lo demás que necesita.

+1

Esto es bueno a menos usted está lidiando con muchos archivos ...> 10,000. Te quedarás sin memoria. – NexusRex

+0

@NexusRex: No deberías estar leyendo 10.000 registros de una base de datos o bien, pero que está fuera de alcance por lo que la pregunta se refiere – stillstanding

+0

Convenido! Sin embargo, si lee desde una base de datos, puede paginar con "límite"; no hay tanta suerte cuando tiene un directorio con 5 millones de archivos XML para iterar. – NexusRex

34

Si usted no tiene acceso a la clase DirectoryIterator intente esto:

<?php 
$path = "/path/to/files"; 

if ($handle = opendir($path)) { 
    while (false !== ($file = readdir($handle))) { 
     if ('.' === $file) continue; 
     if ('..' === $file) continue; 

     // do something with the file 
    } 
    closedir($handle); 
} 
?> 
+3

¿Puedes nombrar una situación en la que no tendrías acceso a ella? –

+9

Muchas aplicaciones heredadas usan PHP 4, que no tiene acceso al DirectoryIterator. –

+1

Por qué '.' === $ archivo? Esto no es Java. –

6

También puede hacer uso de FilesystemIterator. Requiere incluso menos código que DirectoryIterator, y elimina automáticamente . y ...

$fileSystemIterator = new FilesystemIterator('images'); 

$entries = array(); 
foreach ($fileSystemIterator as $fileInfo){ 
    $entries[] = $fileInfo->getFilename(); 
} 

var_dump($entries); 

//OUTPUT 
object(FilesystemIterator)[1] 

array (size=14) 
    0 => string 'aa[1].jpg' (length=9) 
    1 => string 'Chrysanthemum.jpg' (length=17) 
    2 => string 'Desert.jpg' (length=10) 
    3 => string 'giphy_billclinton_sad.gif' (length=25) 
    4 => string 'giphy_shut_your.gif' (length=19) 
    5 => string 'Hydrangeas.jpg' (length=14) 
    6 => string 'Jellyfish.jpg' (length=13) 
    7 => string 'Koala.jpg' (length=9) 
    8 => string 'Lighthouse.jpg' (length=14) 
    9 => string 'Penguins.jpg' (length=12) 
    10 => string 'pnggrad16rgb.png' (length=16) 
    11 => string 'pnggrad16rgba.png' (length=17) 
    12 => string 'pnggradHDrgba.png' (length=17) 
    13 => string 'Tulips.jpg' (length=10) 

Enlace: http://php.net/manual/en/class.filesystemiterator.php

0

Puede utilizar este código para bucle thorugh un directorio recusivly:

$path = "/home/myhome"; 
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME); 
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) { 
    echo $file."\n"; 
} 
5
$files = glob('folder/*.{jpg,png,gif}', GLOB_BRACE); 

foreach($files as $file) 
{  
    //do your work here  
} 
+0

Me encanta esta solución. ¿Esto encontrará archivos anidados también, o solo archivos en el directorio especificado? –

+0

Solo el directorio actual Joe. –

Cuestiones relacionadas