98 votes

Obtenir les noms de tous les fichiers dans un répertoire avec PHP

Pour une raison quelconque, je continue à obtenir un '1' pour les noms de fichiers avec ce code :

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

Lorsque je fais écho à chaque élément dans $ results_array, j'obtiens un paquet de '1', pas le nom du fichier. Comment puis-je obtenir le nom des fichiers ?

187voto

Tatu Ulmanen Points 52098

Ne vous embêtez pas avec open/readdir et utilisez glob la place :

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

57voto

Ilija Points 518

Style SPL :

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

Consultez les classes DirectoryIterator et SplFileInfo pour la liste des méthodes disponibles que vous pouvez utiliser.

22voto

ali Points 511

Comme la réponse acceptée comporte deux lacunes importantes, je publie la réponse améliorée pour les nouveaux arrivants qui cherchent une réponse correcte :

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Il est nécessaire de filtrer les résultats de la fonction globe is_file avec %-% + %-%, car cela pourrait également renvoyer certains répertoires.
  2. Tous les fichiers n'ont pas un . dans leurs noms, donc le motif */* est nul en général.

18voto

Mike Moore Points 1372

Vous devez entourer $file = readdir($handle) de parenthèses.

Et voilà :

$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 />';
}

15voto

Fletcher Moore Points 3650

Il suffit d'utiliser glob('*'). Voici la documentation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X