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?

DexterW
la source
1
Il existe quelques options utilisant glob .
allnightgrocery
duplication possible de Obtenir la hiérarchie d'un répertoire avec PHP
e-sushi
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
cela fonctionne: halgatewood.com/free-php-list-files-in-a-directory-script
InTheNameOfScience
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) {
    ...
}
Tatu Ulmanen
la source
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.

Ilija
la source
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 />';
}
Mike Moore
la source
14

Utilisez juste glob('*'). Voici la documentation

Fletcher Moore
la source
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.
Aliweb
la source
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/>";
}
YooRich.com
la source
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>";
    }
}
TheCrazyProfessor
la source
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);
ircmaxell
la source
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 )
);
Danijel
la source
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>";
} 
Ad Kahn
la source
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>";
?>
merrais
la source
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
            */
        }
    }
}
Prashant Goel
la source