2011-05-27 21 views
78

Tengo un directorio de imágenes que quiero recorrer y hacer algunos cálculos de archivos. Puede ser simplemente la falta de sueño, pero ¿cómo usaría PHP para buscar en un directorio determinado y recorrer cada archivo utilizando algún tipo de bucle for?Código de bucle para cada archivo en un directorio

Gracias!

Respuesta

215

scandir:

$files = scandir('folder/'); 
foreach($files as $file) { 
    //do your work here 
} 

o glob puede ser aún mejor para sus necesidades:

$files = glob('folder/*.{jpg,png,gif}', GLOB_BRACE); 
foreach($files as $file) { 
    //do your work here 
} 
+11

Me encantó la función glob(), nunca antes había visto esa. ¡Gracias! – Chiggins

+0

¿Se usa la variable '$ files' para evitar llamar' scandir() 'más de una vez en el bucle' foreach'? ¿O puedo incrustarlo directamente sin ningún efecto secundario? – Zero3

+1

@ Zero3, la variable se usa solo para legibilidad. PHP siempre funcionará con una copia de la matriz en cualquier bucle foreach, lo que significa que se llamará scandir() solo una vez. (Y dado que PHP usa copy-on-write, tampoco tendrá problemas de rendimiento con esta "copia"). Sí, puede incrustar la llamada Scandir() sin inconvenientes de rendimiento. –

3

Trate GLOB()

$dir = "/etc/php5/*"; 

// Open a known directory, and proceed to read its contents 
foreach(glob($dir) as $file) 
{ 
    echo "filename: $file : filetype: " . filetype($file) . "<br />"; 
} 
+0

, el tipo de archivo no funciona, devuelve 'archivo'. – Ajibola

+0

@Ajibola qué tal si revisamos la documentación antes de decir que algo no funciona, ¿eh? 'filetype()' devuelve el tipo de archivo. De este modo, los posibles resultados serían 'file, dir, char, block, ...'. Puede usar algo como 'mime_content_type()' si desea conocer el tipo de contenido del archivo. – Vallentin

7

busca la función glob():

<?php 
$files = glob("dir/*.jpg"); 
foreach($files as $jpg){ 
    echo $jpg, "\n"; 
} 
?> 
47

Echa un vistazo a la clase DirectoryIterator.

Desde uno de los comentarios en esa página:

// output all files and directories except for '.' and '..' 
foreach (new DirectoryIterator('../moodle') as $fileInfo) { 
    if($fileInfo->isDot()) continue; 
    echo $fileInfo->getFilename() . "<br>\n"; 
} 

La versión recursiva es RecursiveDirectoryIterator.

+0

Esta debería ser la respuesta principal, mucho más útil y un enfoque más moderno que scandir o glob –

2

Utilice la función glob en un bucle foreach para hacer lo que sea una opción. También utilicé la función file_exists en el ejemplo a continuación para verificar si el directorio existe antes de ir más allá.

$directory = 'my_directory/'; 
$extension = '.txt'; 

if (file_exists($directory)) { 
    foreach (glob($directory . '*' . $extension) as $file) { 
     echo $file; 
    } 
} 
else { 
    echo 'directory ' . $directory . ' doesn't exist!'; 
} 
Cuestiones relacionadas