Obtener los nombres de todos los archivos en un directorio con PHP


87

Por alguna razón, sigo obteniendo un '1' para los nombres de archivo con este código:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

Cuando hago eco de cada elemento en $ results_array, obtengo un montón de '1's, no el nombre del archivo. ¿Cómo obtengo el nombre de los archivos?


1
Hay algunas opciones para usar glob .
Supermercado nocturno


1
El problema que tenía el cartel era que la asignación tiene una prioridad muy baja, por lo que el operador '! ==' se evalúa primero y el resultado binario de esa operación luego se asigna a $ file. La única solución necesaria es usar ($ file = readdir ($ handle))! == FALSE "
Omn


de 69 votos a 70. Me siento lo contrario de Hank Moody
Charlie

Respuestas:


167

No se moleste con open / readdir y use glob en lugar:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
Es posible que desee envolver array_filter(..., 'is_file')ese globo, ya que la pregunta solicita archivos.
salathe

23
No todos los nombres de archivo tienen la forma *.*: simplemente utilícela *en su lugar.
jameshfisher

¿Cómo podemos obtener todos los archivos dentro de la lista de extensiones? Por ejemplo, ¿si queremos todos los archivos .php y .js?
Nis

3
Sí, esta respuesta no es muy sólida. Los archivos no necesitan tener extensiones y se pueden nombrar directorios something.something. Es mejor usar array_filtery glob($log_directory.'/*').
Andrew

Elegí esto porque solo necesitaba la respuesta simple y todos los archivos relevantes para mi caso de uso serían *.*. Una expresión más robusta haría que esta sea una respuesta aún mejor.
TecBrat


18

Necesitas rodear $file = readdir($handle) con paréntesis.

Aqui tienes:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

Como la respuesta aceptada tiene dos deficiencias importantes, estoy publicando la respuesta mejorada para aquellos recién llegados que buscan una respuesta correcta:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Es necesario filtrar los globeresultados de la función con is_file, ya que también podría devolver algunos directorios.
  2. No todos los archivos tienen un .nombre, por lo que el */*patrón apesta en general.

Esta es una ejecución limpia que funcionó para mí. Las respuestas anteriores mostraron directorios en resultados que no quería.
AWP

¡Señor, necesita más votos a favor! En realidad (en Windows) tuve que usar basename($file)para obtener solo el nombre del archivo en lugar de la ruta completa con el nombre del archivo.
Pauloco

10

Tengo un código más pequeño para esto:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

Devolviéndome todos los archivos excepto dos archivos basura llamados "." y "..". No tengo ningún archivo llamado "." y ".." en mi directorio.
kamranbhatti585

1
Use $ archivos = array_diff (scandir ($ ruta), array ('.', '..')); para liberar los errores anteriores que comenté.
kamranbhatti585

Agradable. ¿Cómo elimino las extensiones de los archivos? (Necesito eliminar .phpen cada archivo.)
KSPR

8

En algunos sistemas operativos obtienes . ..y .DS_Store, bueno, no podemos usarlos, así que ocultémoslos.

Primero comience a obtener toda la información sobre los archivos, usando scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

Se debe a la frecuencia del operador. Intente cambiarlo a:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()y FilesystemIteratorejemplos:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

Podrías probar la scandir(Path)función. es rápido y fácil de implementar

Sintaxis:

$files = scandir("somePath");

Esta función devuelve una lista de archivos en una matriz.

para ver el resultado, puede probar

var_dump($files);

O

foreach($files as $file)
{ 
echo $file."< br>";
} 



0

Solo uso este código:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

Código recursivo para explorar todo el archivo contenido en un directorio ('$ ruta' contiene la ruta del directorio):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.