2010-05-18 21 views
5

ho cercato prima chiedo, senza fortuna ..php scandir -> ricerca di file/directory

io alla ricerca di un semplice script per me, che posso cercare file/cartelle. Ho trovato questo snippet di codice nel manuale php (penso di aver bisogno di questo), ma non è lavoro per me.

"era alla ricerca di un modo semplice per cercare un file/cartella utilizzando una maschera. Qui è una tale funzione.

Per impostazione predefinita, questa funzione non mancherà di tenere in memoria il risultato scandir(), per evitare scaning più volte per la stessa directory. "

<?php 
function sdir($path='.', $mask='*', $nocache=0){ 
    static $dir = array(); // cache result in memory 
    if (!isset($dir[$path]) || $nocache) { 
     $dir[$path] = scandir($path); 
    } 
    foreach ($dir[$path] as $i=>$entry) { 
     if ($entry!='.' && $entry!='..' && fnmatch($mask, $entry)) { 
      $sdir[] = $entry; 
     } 
    } 
    return ($sdir); 
} 
?> 

Grazie per tutto l'aiuto,

Peter

risposta

3
$a = new RegexIterator(
    new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator('DIRECTORY HERE') 
    ), 
    '/REGEX HERE/', 
    RegexIterator::MATCH 
); 

foreach ($a as $v) { 
    echo "$v\n"; //$v will be the filename 
} 
+0

Grazie per le risposte, la soluzione Artefacto-s è un bene per me, ma! C'è una soluzione simile senza regex? O qual è la regex, quando voglio solo cercare nei nomi dei file con/senza maschere? esempio: stackoverflow.zip e voglio cercare su "overflow", o "stack", o "stackoverflow" ... Grazie mille! – Peter

+1

Per questo è necessario solo regexes 'overflow',' stack' e 'stackoverflow'. Questi tre corrisponderebbero a "stackoverflow.zip". Puoi usare regex in questo modo semplice, devi solo fare attenzione a sfuggire a personaggi che hanno un significato speciale. – Artefacto

+0

Così semplice !! Grazie mille! – Peter

0

mi si vuole solo cercare un file, è possibile utilizzare questo frammento:

<?php 
    $s = $get['s']; 
    $e = ".htm"; 
    $folders = array("data1", "data2", "data3"); 
    $files = array(); // nothing needed here. anything in this array will be showed as a search result. 
    for($i=0;$i<=count($folders)-1;$i++) { 
     $glob = glob($folders[$i]); 
     $files = array_merge($files, $glob[$i]); 
    } 
    echo "Search - $s<br><br>"; 
    if(count($files) == 1) { 
     echo "<li><a href='$files[0]'>".heir($files[0])."</a></li>"; 
    } 
    if(count($files) != 1) { 
     for($i=0;$i<=count($files)-1;$i++) { 
      echo "<li><a href='$files[$i]'>".heir($files[$i])."</a></li>"; 
     } 
    } 
    if(count($files) == 0) { 
     echo "Sorry, no hits."; 
    } 
?> 
0

La risposta accettata è davvero bella, ma mi ha fatto pensare agli iteratori di Spl sulla roccia. Fabien Potencier spiega come ha creato le classi Finder in symfony qui:

http://fabien.potencier.org/article/43/find-your-files

Io uso anche le sue lezioni finder, hanno un'interfaccia molto piacevole incatenato.

Esempio:

use Symfony\Component\Finder\Finder; 

$finder = new Finder(); 
$finder->files()->in(__DIR__); 

foreach ($finder as $file) { 
    print $file->getRealpath()."\n"; 
} 

e anche ..

$finder->files()->name('*.php'); 
// or 
$finder->files()->size('>= 1K')->size('<= 2K'); 
$finder->date('since yesterday'); 

Documentat ione: http://symfony.com/doc/2.0/cookbook/tools/finder.html

La versione + PHP5.2 dal quadro sf1.4: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php

Questa versione è leggermente diversa, e meno fantasia, ma fa anche il lavoro. Avrai bisogno di creare una classe sfException, è il solo legame con il framework symfony. Si può creare una classe sfException:

class sfException extends Exception { } 

La documentazione può essere trovato qui: http://www.symfony-project.org/cookbook/1_2/en/finder