web-dev-qa-db-fra.com

PHP) un script pour parcourir tous les fichiers d’un répertoire?

Je recherche un script PHP) qui parcourt tous les fichiers d'un répertoire afin de pouvoir utiliser le nom de fichier, comme le formatage, l'impression ou l'ajouter à un lien. Je souhaite pouvoir trier les fichiers par nom, par type ou par date de création/d’ajout/de modification (pensez au répertoire "index" de fantaisie). J'aimerais également pouvoir ajouter des exclusions à la liste des fichiers, telles que le script lui-même ou d'autres fichiers "système" (comme le . et .. "répertoires".)

Etant donné que j'aimerais pouvoir modifier le script, je suis plus intéressé par la documentation = PHP) et par apprendre à en écrire une moi-même. Cela dit, s'il en existe une existante scripts, tutoriels et autres joyeusetés, s'il vous plaît faites le moi savoir.

116
Moshe

Vous pouvez utiliser le DirectoryIterator . Exemple du manuel php:

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}
?>
221
Morfildur

Si vous n'avez pas accès à la classe DirectoryIterator, essayez ceci:

<?php
$path = "/path/to/files";

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;

        // do something with the file
    }
    closedir($handle);
}
?>
40
NexusRex

Utilisez la fonction scandir():

<?php
    $directory = '/path/to/files';

    if (! is_dir($directory)) {
        exit('Invalid diretory path');
    }

    $files = array();

    foreach (scandir($directory) as $file) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;

        $files[] = $file;
    }

    var_dump($files);
?>
18
ChorData

Vous pouvez également utiliser FilesystemIterator. Il nécessite encore moins de code que DirectoryIterator et supprime automatiquement . et ...

// Let's traverse the images directory
$fileSystemIterator = new FilesystemIterator('images');

$entries = array();
foreach ($fileSystemIterator as $fileInfo){
    $entries[] = $fileInfo->getFilename();
}

var_dump($entries);

//OUTPUT
object(FilesystemIterator)[1]

array (size=14)
  0 => string 'aa[1].jpg' (length=9)
  1 => string 'Chrysanthemum.jpg' (length=17)
  2 => string 'Desert.jpg' (length=10)
  3 => string 'giphy_billclinton_sad.gif' (length=25)
  4 => string 'giphy_shut_your.gif' (length=19)
  5 => string 'Hydrangeas.jpg' (length=14)
  6 => string 'Jellyfish.jpg' (length=13)
  7 => string 'Koala.jpg' (length=9)
  8 => string 'Lighthouse.jpg' (length=14)
  9 => string 'Penguins.jpg' (length=12)
  10 => string 'pnggrad16rgb.png' (length=16)
  11 => string 'pnggrad16rgba.png' (length=17)
  12 => string 'pnggradHDrgba.png' (length=17)
  13 => string 'Tulips.jpg' (length=10)

Lien: http://php.net/manual/en/class.filesystemiterator.php

11
Julian

Vous pouvez utiliser ce code pour parcourir un répertoire récursivement:

$path = "/home/myhome";
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {
    echo $file."\n";
}
3
GameScripting

glob () contient des dispositions pour le tri et la recherche de motifs. Comme la valeur de retour est un tableau, vous pouvez faire presque tout ce dont vous avez besoin.

2
bcosca

Pour être complet (puisque cela semble être une page à trafic élevé), n'oublions pas le bon vieux dir() function :

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired

print_r($entries);
1
Sz.