konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


Tips

glob関数とは

PHPには、パターンにマッチするファイル名一覧を取得するために、glob関数が存在します。

例えば…

$files = glob('/foo/bar/*.txt');

…と書くだけで、"/foo/bar/"ディレクトリの中にある、拡張子が".txt"のファイル一覧を取得できます。

サーバ上の任意のディレクトリに存在するファイル一覧を使ったアプリケーションを作るのに重宝する関数です。

glob関数の問題点

こんなに便利なglob関数にも、実は大きな問題点があります。
それは、OSによって戻り値が異なる事です。

パターンにマッチするファイル名が存在しないケースでは、 Linuxではarray()が、Linux以外のOSではFALSEが返ります。
OSによって戻り値が異なる事自体も問題なのですが、問題の本質はもっと根深い部分にあります。

ファイル関数の大半は、戻り値としてFALSEが返ってきた場合は、何らかの理由でfile I/O errorが発生した事を示します。
誤ったパスなどを指定したり、アクセス権限などの問題でファイルにアクセスできなかった場合、FALSEが返る事を期待したいところですが、Linux以外のOSで1件もマッチしない場合もFALSEが返ってきてしまいます。

このままでは、ファイルにアクセスができなかったのか、マッチするファイルが0件だったのかが判断できない事になります。

回避策

この問題を回避するには、glob関数の第2引数にGLOB_NOCHECK定数を指定します。
これによって、マッチするファイルが0件だった場合は、 FALSEではなく第1引数の値がarray(第1引数の値)の形で戻ります。

これを判別するには、下記のスクリプトを参考にすると良いでしょう。

<?
$pattern = "/foo/bar/*.txt";
$ret = glob($pattern, GLOB_NOCHECK);
if (is_array($ret)) {
    if (count($ret) == 0 || $ret[0] == $pattern) {
        print "no match.\n";
    } else {
        print count($ret) . " file(s) match.\n";
    }
} else {
    print "file I/O error.\n";
}
?>

添付ファイル: fileglob_sample.php 3276件 [詳細]

最終更新のRSS