2010-07-21 7 views
24

Necesito verificar si existe un archivo pero no conozco la extensión.Existe un archivo de comprobación de PHP sin conocer la extensión

IE me gustaría hacer:

if(file_exists('./uploads/filename')): 
// do something 
endif; 

Por supuesto que no trabajará, ya que no tiene extensión. la extensión será jpg, jpeg, png, gif

¿Alguna idea de una forma de hacer esto sin hacer un bucle?

Respuesta

48

Usted tendría que hacer un glob():

$result = glob ("./uploads/filename.*"); 

y ver si $result contiene nada.

+11

'glob' también se puede utilizar con una expansión de llaves tipo bash:' glob ("./ uploads/filename. {Jpg, jpeg, png, gif}", GLOB_BRACE) '. – Gumbo

+0

@pekka: Muchas gracias. –

-1

¿Sabía usted acerca de la función de tipo de archivo PHP? http://php.net/manual/en/function.filetype.php

o de otra manera is_file() http://www.php.net/manual/en/function.is-file.php

+0

Esto no parece que soluciona la pregunta en absoluto –

+0

Pero no puede obtener el tipo de archivo sin conocer el nombre completo del archivo, que es su problema exacto. Él sabe que el archivo se llama 'filename. ???', y necesita saber cómo encontrar el '???' sin pasar por un montón de extensiones comprobando cada una de ellas –

+0

Tienes razón ... no entendí el tipo de archivo. Pero él podría hacerlo con is_file(). ¿No lo crees? – gearsdigital

3

Tengo la misma necesidad, y trató de utilizar pegote pero esta función no parece ser portátil:

Véanse las notas de http://php.net/manual/en/function.glob.php:

Nota: Esta función no está disponible en algunos sistemas (por ejemplo, el antiguo SO Sun).

Nota: El indicador GLOB_BRACE no está disponible en algunos sistemas que no son GNU, como Solaris.

También más lento que opendir, echar un vistazo a: Which is faster: glob() or opendir()

así que he hecho una función fragmento que hace la misma cosa:

function resolve($name) { 
    // reads informations over the path 
    $info = pathinfo($name); 
    if (!empty($info['extension'])) { 
     // if the file already contains an extension returns it 
     return $name; 
    } 
    $filename = $info['filename']; 
    $len = strlen($filename); 
    // open the folder 
    $dh = opendir($info['dirname']); 
    if (!$dh) { 
     return false; 
    } 
    // scan each file in the folder 
    while (($file = readdir($dh)) !== false) { 
     if (strncmp($file, $filename, $len) === 0) { 
      if (strlen($name) > $len) { 
       // if name contains a directory part 
       $name = substr($name, 0, strlen($name) - $len) . $file; 
      } else { 
       // if the name is at the path root 
       $name = $file; 
      } 
      closedir($dh); 
      return $name; 
     } 
    } 
    // file not found 
    closedir($dh); 
    return false; 
} 

Uso:

$file = resolve('/var/www/my-website/index'); 
echo $file; // will output /var/www/my-website/index.html (for example) 

Espero que pueda ayudar a alguien, Ioan

Cuestiones relacionadas