2010-07-21 15 views
24

Muszę sprawdzić, czy plik istnieje, ale nie znam rozszerzenia.Plik sprawdzania PHP istnieje bez znajomości rozszerzenia

IE Chciałbym zrobić:

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

Oczywiście, że nie będzie działać, ponieważ nie ma rozszerzenia. rozszerzenie będzie albo jpg, jpeg, png, gif

Jakieś pomysły na sposób robienia tego bez robienia pętli?

Odpowiedz

48

Trzeba by zrobić glob():

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

i zobaczyć czy $result zawiera niczego.

+11

'glob' może być również używany z rozszerzeniem nawiasów podobnych do bash:' glob ("./ uploads/filename. {Jpg, jpeg, png, gif}", GLOB_BRACE) '. – Gumbo

+0

@pekka: Wielkie dzięki. –

-1
+0

To nie wygląda na to, że w ogóle odpowiada na pytanie. –

+0

Ale nie może pobrać nazwy pliku bez znajomości kompletnej nazwy pliku, co jest jego dokładnym problemem. Wie, że plik nazywa się "filename. ???", i musi wiedzieć, jak znaleźć "???" bez pętli nad kilkoma rozszerzeniami sprawdzającymi każdy z nich –

+0

Masz rację ... I missunderstood filetype. Ale mógł to zrobić za pomocą is_file(). Czy nie sądzisz? – gearsdigital

3

Mam te same potrzeby i próbował użyć glob, ale funkcja ta wydaje się nie być przenośny:

Zobacz notatki z http://php.net/manual/en/function.glob.php:

Uwaga: Ta funkcja nie jest dostępna w niektórych systemach (np. Stary system operacyjny Sun).

Uwaga: Flaga GLOB_BRACE nie jest dostępna w niektórych systemach innych niż GNU, takich jak Solaris.

również bardziej wolniej niż opendir, przyjrzeć: Which is faster: glob() or opendir()

Więc zrobiłem funkcję urywek, który robi to samo:

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

Zastosowanie:

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

Mam nadzieję, że ktoś może pomóc, Ioan

Powiązane problemy