2010-05-18 22 views
5

busqué antes de pedir, sin suerte ..php scandir -> búsqueda de archivos/directorios

I en busca de un script sencillo para mí, que puedo buscar archivos/carpetas. Encontré este fragmento de código en el manual de php (creo que necesito esto), pero no funciona para mí.

"Estaba buscando una forma sencilla de buscar un archivo/directorio utilizando una máscara. Aquí es una función de este tipo.

Por defecto, esta función se mantendrá en la memoria el resultado scandir(), para evitar scaning tiempo múltiple para el mismo directorio ".

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

Gracias por cualquier ayuda,

Peter

Respuesta

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

Gracias por las respuestas, solución Artefacto-s es bueno para mí, pero! ¿Hay una solución similar sin regex? ¿O qué es la expresión regular, cuando solo quiero buscar en los nombres de archivo con/sin máscaras? ejemplo: stackoverflow.zip y quiero buscar en "overflow", o "stack", o "stackoverflow" ... ¡Muchas gracias! – Peter

+1

Para eso solo necesitas las expresiones regulares 'overflow',' stack' y 'stackoverflow'. Esos tres coincidirían con "stackoverflow.zip". Puedes usar expresiones regulares de esa manera simple, solo tienes que tener cuidado para escapar de los personajes que tienen un significado especial. – Artefacto

+0

Soo simple !! ¡Muchas gracias! – Peter

0

i lo que desea es buscar un archivo, puede utilizar este fragmento:

<?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 respuesta aceptada es muy buena, pero me hizo pensar en los iteradores Spl sobre las rocas. Fabien Potencier explica cómo creó las clases Finder en Symfony aquí:

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

También utilizo sus clases del buscador, tienen una interfaz muy agradable encadenado.

Ejemplo:

use Symfony\Component\Finder\Finder; 

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

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

y también ..

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

DOCUMENTACIÓN ión: http://symfony.com/doc/2.0/cookbook/tools/finder.html

La versión + PHP5.2 del marco sf1.4: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php

Esta versión es ligeramente diferente, y menos sofisticado, pero también hace el trabajo. Sin embargo, necesitarás crear una clase sfException, es su único vínculo con el framework symfony. Usted puede crear su propia clase sfException:

class sfException extends Exception { } 

documentación se puede encontrar aquí: http://www.symfony-project.org/cookbook/1_2/en/finder