プログラミング苦吟。

PHPとかデータベースとかVBとかで藻掻いている話。

PHPでディレクトリファイルの一覧を取得(glob)。

2008年09月29日 21時04分16秒 | PHP

やっぱり胡乱な自作データベースシステムの話。

特定ディレクトリ内のファイルの一覧を取得して、まとめて処理させようと考えた。
でもって手元の参考書籍を調べると、readdir関数を使うより無さそうな。コードの例はこんな感じ。

$h = opendir($dir);
while ($f = readdir($h)){
     ...
}

この方法だとワイルドカード(?とか*とか)は使えないし、ループの最初の2回は現在のディレクトリ(カレント)を示す“.”と1つ上のディレクトリ(ペアレント)を示す“..”が返ってくるから、それを弾く処理をせんといかん。

ワイルドカードが使えないと、ファイル数が多い場合には厄介。
例えば同じディレクトリに anya-1.jpg ... anya-100.jpgolga-1.jpg ... olga-100.jpgtanya-1.jpg ... tanya-100.jpgyulya-1.jpg ... yulya-100.jpg という400個のファイルがあったとして、ここから tanya-29.jpg ... tanya-78.jpg を取り出したい場合には、ファイル一覧の先頭から tanya-29.jpg が出てくるまで根気強く調べなくちゃならん。これは面倒だし、ファイル数が多いと処理にえらいこと時間が掛かってしまう。(ファイル名の並び順(ソート順)の関係で、tanya-29.jpg ... tanya-78.jpgの間に tanya-3.jpg とか tanya-6.jpg とかが混ざってくるのは、また別のお話)

今回の件では最大1200個くらいのファイルがあるから、どーしたもんかと困っていた折、これまたどっかのQ&Aサイトだったかで、globという関数を使うと簡単に処理できてワイルドカードも使えてアラお得(笑)なことが判った。
PHP公式マニュアルの記述から抜き書きすると、

array glob ( string $pattern [, int $flags ] )

$patternは、ディレクトリ名やファイル名を指定するパターン。“./photo/tanya-*.jpg”みたいな感じ。
$flagsは、動作指定のフラグ。後述。

glob関数を使ってファイルの一覧を取得して何らかの処理をさせる場合は、

$flist = glob($dir.$fmask);
for ($c=0; $c<=count($flist); $c++){
    ...
}

ってな感じ。
readdir関数と違い“.”や“..”を返さないから、余計な処理をする必要が無いのも宜し。

$flagsパラメータは気にしてなかったけれど、もしかしたらGLOB_NOSORTを使うと、Windowsでは“tanya-29.jpg”の後に“tanya-3.jpg”が来たりしないんだろか。それとも逆か知らん。
この辺は、気が向いたらまた後日。
$flagsパラメータは考慮してなかったから、MySQL使って処理させてるのさっ。…これはまたこれでンもう…。PHPのsort関数とかも使うべきかも。

 

閑話ながら。
ワイルドカードって当たり前のように使うけれど、元の意味は何だべさ?…と調べてみたら、米Yahoo!の翻訳サービスBabel Fishに依ると〔未知数〕だそう。IT用語辞典 e-Wordsの解説では〔ファイル名やディレクトリ名を指定するときに使う、「任意の文字」を意味する特殊文字〕。Yahoo!翻訳ではそのまんま音訳で〔ワイルドカード〕。コンピュータ用語としてはもちろんe-Wordsの解説が判りやすいけれど、他の用途で使われる場合も考えに入れると、〔未知数〕も捨て難い。
…翻訳サービスで〔野蛮な札〕とか訳されたら、どーしてくれよーかと身構えてしまった(笑)

 

旧版の参考書籍にツッコミを入れられても困るだろうけれど、このglob関数も載っていなかった。
実装がPHPの4.3.0あたりからだったからか、これまたあまり使われないと見倣されたか。

も一つオマケに。
readdir関数の解説で、“0”というディレクトリ名(ファイル名もだろ)があると〔FALSEであるとみなされ、意図しない動作となる可能性があるので注意しましょう〕とある。PHP公式マニュアルでは

この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0"" といった値を返す可能性もあります。詳細については 論理値のセクションを参照してください。この関数の返り値を調べるには ===演算子 を使用してください。

としており、こちらの解説の方が親切だな。
単に〔注意しましょう〕って云われてもなあ…。巻頭近くの演算子の説明では===演算子(値・型共に比較)にも触れてるのに、紙幅の関係か知らん。

 

さらに気になることが。
Amazonに載ってる新版の解説には、〔PHP5.1よりバンドルされ、データベースにアクセスするための軽量/高性能なデータベース関数群PDOや、PHPでの開発において必要不可欠なライブラリ群なども網羅し、より実践的で実用度の高いリファレンスになりました〕とある。
それじゃあさぞかしページ数が増えて分厚くなったことだろう…と見ると、旧版の591pに対して新版は584p。減ってんじゃん!

内容が減らされたんでなきゃあ、いいけどなあ。それでなくても旧版では調べてることの答えを見付け辛く、隔靴掻痒の感がなきにしもあらずの本だから。
続篇は往々にして、わりと安直に作ることが多いのも怖いところ。実物を他社の類書と見比べてからでないと買えないな。

PHP辞典 第2版 (DESKTOP REFERENCE)
西沢 直木
翔泳社

このアイテムの詳細を見る
PHP辞典 (Desktop reference)
西沢 直木
翔泳社

このアイテムの詳細を見る