2010-04-30 42 views
46

¿Hay alguna manera de escribir la función PHP file_exists para que busque en un directorio un archivo con una extensión arbitraria? Por ejemplo, supongamos que sabía que un archivo se llamaba "hola", pero no sabía la extensión, ¿cómo escribiría una función que buscara un archivo llamado hello. * Y le devolviera el nombre de este archivo? Por lo que puedo decir, file_exists solo buscará una cadena.PHP file_exists y comodín

Gracias.

+1

* (relacionado) * http://www.phparch.com/2010/04/28/putting-glob-to-the-test/ – Gordon

Respuesta

81

Está buscando la función glob().

file_exists no realiza ningún tipo de búsqueda: solo permite saber si un archivo existe o no, al conocer su nombre.

Y, con PHP> = 5.3, puede usar el nuevo GlobIterator.


Como un ejemplo con glob(), la porción siguiente de código:

$list = glob('temp*.php'); 
var_dump($list); 

me da este resultado:

array 
    0 => string 'temp-2.php' (length=10) 
    1 => string 'temp.php' (length=8) 


Mientras éste:

$list = glob('te*-*'); 
var_dump($list); 

Sí, con dos * ;-)

me dará:

array 
    0 => string 'temp-2.php' (length=10) 
    1 => string 'test-1.php' (length=10) 
    2 => string 'test-curl.php' (length=13) 
    3 => string 'test-phing-1' (length=12) 
    4 => string 'test-phpdoc' (length=11) 
+0

+1 me ganó. –

+0

Sabía que debía haber una mejor función para esto. ¡Gracias! – bsamek

+0

De nada :-) Diviértete! –

4

A partir de PHP5.3, también puede utilizar el GlobIterator para buscar un directorio con caracteres comodín:

$it = iterator_to_array(
    new GlobIterator('/some/path/*.pdf', GlobIterator::CURRENT_AS_PATHNAME)); 

devolvería las rutas completas a todos los archivos .pdf en some/path en una matriz. Lo anterior tiene el mismo rendimiento que glob(), pero los iteradores proporcionan una API más poderosa y extensible.

1

Si necesita un poco más de control y está en pre PHP 5.3, podría utilizar un DirectoryIterator o RecursiveDirectoryIterator. Ambos tienen una gran función para mayor control y manipulación.

documentos PHP están en DirectoryIterator y RecursiveDirectoryIterator

3

Mientras file_exists devuelve un booleano que escribí esta pequeña función que acepta una cadena de búsqueda con * para buscar archivos ... Ejemplo:

searchForFile("temp*"); 

    function searchForFile($fileToSearchFor){ 
     $numberOfFiles = count(glob($fileToSearchFor)); 
     if($numberOfFiles == 0){ return(FALSE); } else { return(TRUE);} 
    } 
+0

Funciona como el encanto. Nota al margen: es posible que deba agregar la parte $ _SERVER ['DOCUMENT_ROOT'] al frente del nombre del archivo. –