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


87

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);
    }
}

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


1
Il existe quelques options utilisant glob .
allnightgrocery


1
Le problème du poster était que l'affectation a une priorité très faible, donc l'opérateur '! ==' est évalué en premier et le résultat binaire de cette opération est ensuite affecté à $ file. Le seul correctif nécessaire est d'utiliser ($ file = readdir ($ handle))! == FALSE "
Omn


de 69 voix à 70. Je me sens comme le contraire de Hank Moody
Charlie

Réponses:


167

Ne vous embêtez pas avec open / readdir et utilisez à la globplace:

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

24
Vous voudrez peut-être entourer array_filter(..., 'is_file')ce glob puisque la question demande des fichiers.
salathe

23
Tous les noms de fichiers n'ont pas la forme *.*: utilisez simplement à la *place.
jameshfisher

Comment pouvons-nous obtenir tous les fichiers dans la liste des extensions? Par exemple, si nous voulons tous les fichiers .php et .js?
Nis

3
Ouais, cette réponse n'est pas très robuste. Les fichiers n'ont pas besoin d'avoir des extensions et les répertoires peuvent être nommés something.something. Il vaut mieux utiliser array_filteret glob($log_directory.'/*').
Andrew

J'ai voté pour cela parce que j'avais juste besoin d'une réponse simple et que tous les fichiers pertinents pour mon cas d'utilisation seraient *.*. Une expression plus robuste en ferait une réponse encore meilleure.
TecBrat

49

Style SPL :

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

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


Excellent moyen d'obtenir uniquement des fichiers et juste leurs noms au lieu du chemin complet, merci!
Chris

1
Oui. Pour les chemins complets, vous pouvez utiliser getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

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

Voici:

$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

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

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Le filtrage des globerésultats de la fonction avec is_fileest nécessaire, car il peut également renvoyer certains répertoires.
  2. Tous les fichiers n'ont pas de nom .dans leur nom, donc le */*motif est nul en général.

C'est une exécution propre qui a fonctionné pour moi. Les réponses précédentes montraient des répertoires dans des résultats que je ne voulais pas.
AWP

Vous avez besoin de plus de votes positifs! En fait (sous Windows), je devais utiliser basename($file)pour obtenir uniquement le nom du fichier au lieu du chemin complet avec le nom du fichier.
Pauloco

10

J'ai un code plus petit pour faire ceci:

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

Me renvoyant tous les fichiers sauf deux fichiers de déchets nommés "." et "..". Je n'ai aucun fichier nommé "." et ".." dans mon répertoire.
kamranbhatti585

1
Utilisez $ files = array_diff (scandir ($ path), array ('.', '..')); pour libérer les erreurs ci-dessus dont j'ai discuté.
kamranbhatti585

Agréable. comment supprimer les extensions des fichiers? (Je dois supprimer .phpsur chaque fichier.)
KSPR

8

Sur certains OS que vous obtenez . ..et .DS_Store, nous ne pouvons pas les utiliser, alors nous les cachons.

Commencez par obtenir toutes les informations sur les fichiers, en utilisant 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

Cela est dû à la précision des opérateurs. Essayez de le changer en:

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

2

glob()et FilesystemIteratorexemples:

/* 
 * 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

Vous pouvez simplement essayer la scandir(Path)fonction. il est rapide et facile à mettre en œuvre

Syntaxe:

$files = scandir("somePath");

Cette fonction renvoie une liste de fichiers dans un tableau.

pour voir le résultat, vous pouvez essayer

var_dump($files);

Ou

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



0

J'utilise juste ce code:

<?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

Code récursif pour explorer tout le fichier contenu dans un répertoire ('$ path' contient le chemin du répertoire):

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
            */
        }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.