2010-11-17 8 views
98

Je cherche un script PHP qui boucle tous les fichiers dans un répertoire afin que je puisse faire des choses avec le nom de fichier, comme le format, l'impression ou l'ajouter à un lien. J'aimerais pouvoir trier les fichiers par nom, type ou date de création/ajout/modification. (Pensez répertoire fantaisie "index".) J'aimerais aussi être en mesure d'ajouter des exclusions à la liste des fichiers, tels que le script lui-même ou d'autres fichiers "système". Comme les . et .. "répertoires".)Script PHP pour parcourir tous les fichiers dans un répertoire?

Étant donné que je voudrais pouvoir modifier le script, je suis plus intéressé par les documents PHP et apprendre à en écrire un moi-même. Cela dit, s'il existe des scripts existants, des tutoriels et autres joyeusetés, s'il vous plaît faites le moi savoir.

+0

http://stackoverflow.com/questions/1086105/ get-the-files-inside-a-directory/1086110 # 1086110 – zloctb

Répondre

185

Vous pouvez utiliser le DirectoryIterator. Exemple de PHP Manual:

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

Note: Beaucoup de serveurs n'ont pas de SPL installé, donc vous ne pourrez pas utiliser le Di Classe rectoryIterator (voir mon post alternatif ci-dessous). Utilisez ceci si vous le pouvez! – NexusRex

+1

Note [2]: Assurez-vous que vous comprenez que la fonction '' dirname() '' ci-dessus obtiendra le dossier parent du chemin que vous y avez placé. Dans mon cas, j'ai supposé que dirname était un wrapper pour le nom/chemin du répertoire, donc ce n'était pas nécessaire. – willdanceforfun

+0

En outre, si dirname est un grand système de fichiers, des problèmes de mémoire sont évidents. Sur mon cas avec 1 millons de fichiers, l'application a besoin de ~ 512M ram sur memory_limit. – abkrim

14

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); 
?> 
2

glob() a des dispositions pour le tri et la mise en correspondance de motif. Puisque la valeur de retour est un tableau, vous pouvez faire tout ce dont vous avez besoin.

+1

Ceci est bien sauf vous avez affaire à beaucoup de fichiers ...> 10 000. Vous allez manquer de mémoire. – NexusRex

+0

@NexusRex: Vous ne devriez pas non plus lire 10 000 enregistrements à partir d'une base de données, mais c'est hors de portée en ce qui concerne la question – stillstanding

+0

D'accord! Si vous lisez à partir d'une base de données, vous pouvez paginer avec "limite" cependant-pas une telle chance quand vous avez un répertoire avec 5 millions de fichiers XML à parcourir. – NexusRex

34

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); 
} 
?> 
+3

Pouvez-vous nommer une situation où vous n'y auriez pas accès? –

+9

Beaucoup d'applications héritées utilisent PHP 4, qui n'a pas accès à DirectoryIterator. –

+1

Pourquoi "." === $ fichier? Ce n'est pas Java. –

6

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

$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

0

Vous pouvez utiliser ce code pour boucle répercutant un répertoire recusivly:

$path = "/home/myhome"; 
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME); 
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) { 
    echo $file."\n"; 
} 
5
$files = glob('folder/*.{jpg,png,gif}', GLOB_BRACE); 

foreach($files as $file) 
{  
    //do your work here  
} 
+0

Aimez cette solution. Est-ce que cela trouvera aussi bien des fichiers imbriqués, ou seulement des fichiers dans le répertoire spécifié? –

+0

Seulement le répertoire actuel Joe. –

Questions connexes