2010-07-21 6 views
24

Devo verificare se esiste un file ma non conosco l'estensione.Il file di controllo PHP esiste senza conoscere l'estensione

IE vorrei fare:

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

Naturalmente questo non funzionerà come ha alcuna estensione. l'estensione sarà jpg, jpeg, png, gif

Qualche idea di un modo per farlo senza fare un ciclo?

risposta

48

Si dovrebbe fare un glob():

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

e vedere se $result contiene qualcosa.

+11

'glob' può anche essere usato con un'espansione di parentesi di tipo bash:' glob ("./ uploads/filename. {Jpg, jpeg, png, gif}", GLOB_BRACE) '. – Gumbo

+0

@pekka: Grazie mille. –

-1

Sapevi della funzione di filetype PHP? http://php.net/manual/en/function.filetype.php

o in altro modo is_file() http://www.php.net/manual/en/function.is-file.php

+0

Questo non sembra che indirizzi la domanda a tutti –

+0

Ma lui non può ottenere il tipo di file senza conoscere il nome completo del file, che è il suo esatto problema. Sa che il file è chiamato 'filename. ???', e deve sapere come scoprire il '???' senza ricorrere a un gruppo di estensioni che controllano ognuna di esse –

+0

Hai ragione ... mi sono capitato il tipo di file. Ma potrebbe farlo con is_file(). Non la pensi così? – gearsdigital

3

ho lo stesso bisogno, e ha cercato di utilizzare questa funzione glob, ma sembra non essere portatile:

Vedi note da http://php.net/manual/en/function.glob.php:

Nota: questa funzione non è disponibile su alcuni sistemi (ad es. Vecchio sistema operativo Sun).

Nota: il flag GLOB_BRACE non è disponibile su alcuni sistemi non GNU, come Solaris.

E 'anche più lento rispetto opendir, date un'occhiata a: Which is faster: glob() or opendir()

così ho fatto una funzione frammento che fa la stessa 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; 
} 

Usage:

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

Spero che questo possa aiutare qualcuno, Ioan