▼ 開いて閉じる、これ基本
オープンしてる間にreaddir()関数を使ってそこに存在するファイル名を読み出すことができます。
ディレクトリもまたファイルの一種なのでそこにあれば読み出されます。その他、読み込み中のディレクトリおよびその親ディレクトリを表す"."や".."(これらの実体はリンクファイル)も同時に読み出されることになります。
では、指定したディレクトリを読み出すコードを書いてみます。
▼ ディレクトリの読み出し
注意すべきことは、もし「while ($file=readdir($fp))」と書いてしまうと"0"というファイル名(またはディレクトリ名)があった場合にそこでループを抜けて途中終了となるのでここは必ず返り値がfalseかどうかを見ること。
と、ここまでは単に指定したディレクトリにあるファイルやらディレクトリやらを区別なく見てるだけで終わらせていました。
幸いなことにPHPにはディレクトリかどうかを判別するようなis_dir(),is_file()といった便利な関数が用意されているので、これをwhileブロック内で使って、ディレクトリの場合は更にその中も見ていく処理を施してみます。
▼ サブディレクトリも読み出す
渡したディレクトリを見ていく関数を作り、そこで再びディレクトリがあれば同関数を呼び出すことで
下の階層にあるディレクトリも再帰的に処理しています。
次は敢えて再帰を使わない方法を書いてみます。
▼ サブディレクトリも読み出す(その2)
再帰版と比べて1段ブロック階層が深いですが、再帰的な関数コールがない分処理が速くなるかも?
処理速度アップのためのテクニックとして、この他にもディレクトリの持つリンク数を数えて2つ(UNIX系の場合"."と"..")ならその下の階層はないと判断する方法もあります。
では次に、与えたファイル名を探索する関数を書いてみます。
▼ ディレクトリサーチ
探索するディレクトリと探索ファイル名を指定すると、見つかったリストを配列で返します。