Файл проверки PHP существует, не зная расширения

Мне нужно проверить, существует ли файл, но я не знаю расширения.

IE я хотел бы сделать:

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

Конечно, это не сработает, так как у него нет расширения. расширение будет jpg, jpeg, png, gif

Любые идеи о том, как это сделать без цикла?


person Lee    schedule 21.07.2010    source источник


Ответы (2)


Вам нужно будет сделать glob():

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

и посмотрите, содержит ли что-нибудь $result.

person Pekka    schedule 21.07.2010
comment
glob также можно использовать с расширением фигурной скобки в стиле bash: glob("./uploads/filename.{jpg,jpeg,png,gif}", GLOB_BRACE). - person Gumbo; 22.07.2010
comment
Есть ли способ также получить файл, если у него нет расширения? - person NaturalBornCamper; 10.12.2019

У меня такая же потребность, и я пытался использовать glob, но эта функция, похоже, не переносима:

См. примечания из http://php.net/manual/en/function.glob.php< /а> :

Примечание. Эта функция недоступна в некоторых системах (например, в старых ОС Sun).

Примечание. Флаг GLOB_BRACE недоступен в некоторых системах, отличных от GNU, таких как Solaris.

Это также медленнее, чем opendir, взгляните на: Что быстрее: glob() или опендир()

Итак, я сделал функцию фрагмента, которая делает то же самое:

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

Использование :

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

Надеюсь, что это может помочь кому-то, Иоан

person Ioan Chiriac    schedule 06.04.2015