web-dev-qa-db-ja.com

PHP拡張子を知らなくてもチェックファイルが存在します

ファイルが存在するかどうかを確認する必要がありますが、拡張子がわかりません。

IE私がしたい:

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

もちろん、拡張子がないのでうまくいきません。拡張子はjpg、jpeg、png、gifのいずれかになります

ループを行わずにこれを行う方法のアイデアはありますか?

30
Lee

glob(): を実行する必要があります

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

$result何でも含まれています。

57
Pekka 웃

私は同じニーズを持っていて、globを使おうとしましたが、この関数は移植性がないようです:

http://php.net/manual/en/function.glob.php からのメモを参照してください:

注:この機能は、一部のシステム(古いSun OSなど)では使用できません。

注:GLOB_BRACEフラグは、Solarisなどの一部の非GNUシステムでは使用できません。

また、opendirよりも遅いので、以下を見てください: どちらが速いか:glob()またはopendir()

だから私は同じことをするスニペット関数を作りました:

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)

それが誰かを助けることができることを願っています、Ioan

4
Ioan Chiriac