2009-12-07 6 views
22

J'essaie de renvoyer les fichiers dans un répertoire spécifié en utilisant une recherche récursive. J'ai réussi à atteindre cet objectif, mais je veux ajouter quelques lignes de code qui me permettront de spécifier certaines extensions que je veux retourner.Recherche de fichier récursif (PHP)

Par exemple, renvoyer uniquement les fichiers .jpg dans le répertoire.

Voici mon code,

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
echo $file . "<br/> \n"; 
} 
?> 

s'il vous plaît laissez-moi savoir ce que je peux ajouter au code ci-dessus pour y parvenir, grâce

Répondre

29
<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$display = Array ('jpeg', 'jpg'); 
foreach(new RecursiveIteratorIterator($it) as $file) 
{ 
    if (in_array(strtolower(array_pop(explode('.', $file))), $display)) 
     echo $file . "<br/> \n"; 
} 
?> 
6

Essayez cela, il utilise un tableau de types de fichiers autorisés et seulement echos sur le fichier si l'extension de fichier existe dans le tableau.

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$allowed=array("pdf","txt"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) { 
     echo $file . "<br/> \n"; 
    } 
} 
?> 

Vous pouvez également constater que vous pouvez fournir un tableau de types de fichiers autorisés à votre RecursiveDirectoryIterator classe et seulement les fichiers correspondant.

20

Vous devez créer un filtre:

class JpegOnlyFilter extends RecursiveFilterIterator 
{ 
    public function __construct($iterator) 
    { 
     parent::__construct($iterator); 
    } 

    public function accept() 
    { 
     return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename()); 
    } 

    public function __toString() 
    { 
     return $this->current()->getFilename(); 
    } 
} 

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$it = new JpegOnlyFilter($it); 
$it = new RecursiveIteratorIterator($it); 

foreach ($it as $file) 
    ... 
+1

Cela ne fonctionnera pas, si vous arrêtez quand trouver un répertoire (si -> isFile()) l'itérateur ne pas en profondeur dans ce répertoire pour numériser des fichiers et des répertoires, est plus complexe qu'une ligne si. – Tecnocat

1

Vous pouvez consulter cette page sur l'utilisation glob() pour une recherche similaire:

http://www.electrictoolbox.com/php-glob-find-files/

+0

Votre source est bonne, mais essayez de donner une réponse constructive avec exemple, comment ressource peut être utilisé pour le cas particulier et seulement ajouter le lien comme référence. –

+0

Je ne pense pas que glob gère la récursion, ce qui faisait partie de la question. – Oded

3

Let PHP faire le travail:

$directory = new RecursiveDirectoryIterator('path/to/directory/'); 
$iterator = new RecursiveIteratorIterator($directory); 
$regex  = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH); 

echo '<pre>'; 
print_r($regex); 
1

En ce qui concerne la réponse la plus souvent votée: J'ai créé ce code qui utilise peu fonctions er, seulement 3, isset(), array_flip(), explode() au lieu de 4 fonctions. J'ai testé la meilleure réponse et elle était plus lente que la mienne. Je suggère à moi de donner un essai:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    $FILE = array_flip(explode('.', $file)); 
    if (isset($FILE['php']) || isset($FILE['jpg'])) { 
     echo $file. "<br />"; 
    } 
}