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?

DexterW
fuente
1
Hay algunas opciones para usar glob .
Supermercado nocturno
posible duplicado de Obtener la jerarquía de un directorio con PHP
e-sushi
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) {
    ...
}
Tatu Ulmanen
fuente
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
49

Estilo SPL :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

Consulte las clases DirectoryIterator y SplFileInfo para ver la lista de métodos disponibles que puede utilizar.

Ilija
fuente
Excelente manera de obtener solo archivos y solo sus nombres en lugar de la ruta completa, ¡gracias!
Chris
1
Si. Para obtener rutas completas, puede usar getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija
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 />';
}
Mike Moore
fuente
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.
Aliweb
fuente
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/>";
}
YooRich.com
fuente
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>";
    }
}
TheCrazyProfessor
fuente
4

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

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);
ircmaxell
fuente
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 )
);
Danijel
fuente
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>";
} 
Ad Kahn
fuente
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>";
?>
Merrais
fuente
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
            */
        }
    }
}
Prashant Goel
fuente