2009-12-07 12 views
22

Estoy tratando de devolver los archivos en un directorio especificado mediante una búsqueda recursiva. Logré esto con éxito, sin embargo, quiero agregar algunas líneas de código que me permitirán especificar ciertas extensiones que deseo que se devuelvan.Búsqueda de archivos recurrentes (PHP)

Por ejemplo, solo devuelve archivos .jpg en el directorio.

Aquí está mi código,

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
echo $file . "<br/> \n"; 
} 
?> 

por favor hágamelo saber lo que puedo agregar al código anterior para lograr esto, gracias

Respuesta

29
<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$display = Array ('jpeg', 'jpg'); 
foreach(new RecursiveIteratorIterator($it) as $file) 
{ 
    if (in_array(strtolower(array_pop(explode('.', $file))), $display)) 
     echo $file . "<br/> \n"; 
} 
?> 
6

Prueba de esto, se utiliza una matriz de tipos de archivo permitidos y solo borra el archivo si la extensión del archivo existe dentro de la matriz.

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$allowed=array("pdf","txt"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) { 
     echo $file . "<br/> \n"; 
    } 
} 
?> 

También puede encontrar que usted podría pasar una matriz de tipos de archivo permitidos a la clase RecursiveDirectoryIterator y sólo devolver los archivos que coinciden.

20

Debe crear un filtro:

class JpegOnlyFilter extends RecursiveFilterIterator 
{ 
    public function __construct($iterator) 
    { 
     parent::__construct($iterator); 
    } 

    public function accept() 
    { 
     return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename()); 
    } 

    public function __toString() 
    { 
     return $this->current()->getFilename(); 
    } 
} 

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$it = new JpegOnlyFilter($it); 
$it = new RecursiveIteratorIterator($it); 

foreach ($it as $file) 
    ... 
+1

Esto no va a funcionar, si se detiene cuando se encuentra un directorio (si -> isFile()) el iterador no lo hacen profundamente en ese directorio para escanear más archivos y directorios, es más complejo que una línea si. – Tecnocat

1

Es posible que desee echa un vistazo a esta página usando glob() para una búsqueda similar:

http://www.electrictoolbox.com/php-glob-find-files/

+0

Su fuente es buena, pero trate de dar una respuesta constructiva con un ejemplo, cómo se puede usar el recurso para el caso particular y solo agregue el enlace como referencia. –

+0

No creo que glob maneje la recursión, que era parte de la pregunta. – Oded

3

Let PHP hacer el trabajo:

$directory = new RecursiveDirectoryIterator('path/to/directory/'); 
$iterator = new RecursiveIteratorIterator($directory); 
$regex  = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH); 

echo '<pre>'; 
print_r($regex); 
1

Respecto a la respuesta más votado: Creé este código que está usando pocos funciones de ER, solo 3, isset(), array_flip(), explode() en lugar de 4 funciones. Probé la respuesta más votada y fue más lenta que la mía. Yo sugiero mina de dar una oportunidad:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    $FILE = array_flip(explode('.', $file)); 
    if (isset($FILE['php']) || isset($FILE['jpg'])) { 
     echo $file. "<br />"; 
    } 
}