2009-12-07 21 views
22

Sto cercando di restituire i file in una directory specificata utilizzando una ricerca ricorsiva. L'ho raggiunto con successo, tuttavia desidero aggiungere alcune righe di codice che mi consentiranno di specificare determinate estensioni che desidero vengano restituite.Ricerca file ricorsiva (PHP)

Ad esempio, restituire solo i file .jpg nella directory.

Ecco il mio codice,

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

fatemelo sapere cosa posso aggiungere al codice di cui sopra per raggiungere questo obiettivo, grazie

risposta

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

Prova questo, utilizza una serie di tipi di file consentiti e solo echos fuori il file se l'estensione del file esiste all'interno della matrice.

<?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"; 
    } 
} 
?> 

Si potrebbe anche scoprire che si potrebbe passare un array di tipi di file consentiti per la classe RecursiveDirectoryIterator e restituire solo i file che corrispondono.

20

Si dovrebbe creare un filtro:

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

questo non funzionerà, se ci si ferma quando trova una directory (se -> isFile()) l'iteratore non lo fanno in profondità in quella directory per la scansione di più file e directory, è più complesso di una sola riga se. – Tecnocat

1

Si potrebbe voler controllare questa pagina sull'utilizzo glob() per una ricerca simile:

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

+0

La tua fonte è buona, ma prova a dare una risposta costruttiva con l'esempio, come utilizzare la risorsa per il caso specifico e aggiungi il link come riferimento. –

+0

Non credo che glob gestisca la ricorsione, che era una parte della domanda. – Oded

3

Let PHP fare il lavoro:

$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

Per quanto riguarda la parte superiore risposta votato: ho creato questo codice che utilizza poche funzioni, solo 3, isset(), array_flip(), explode() anziché 4 funzioni. Ho provato la risposta più votata ed è stata più lenta della mia. Suggerisco dando la mia una prova:

$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 />"; 
    } 
} 
Problemi correlati