- ベストアンサー
サブディレクトリ内の参照
サブディレクトリ内のファイル名の取得方法について教えてください。 <?php $mydir = './log'; if ( $handlerDir = @OpenDir($mydir) ) { while ( $filename = ReadDir( $handlerDir ) ) { if ( $filename != '.' && $filename != '..' ) { $kind = Substr( $filename, -3, 3 ); if ( $kind == 'gif' || $kind == 'jpg' || $kind == 'png' ) { print "{$filename} <br />\n"; } } } } CloseDir($handlerDir); ?> と記述し実行させると、logフォルダ内の画像ファイル名は取得できる のですが、サブフォルダ内のファイル名の取得ができません。 コード不足などであれば、そちらを教えていただければと思います。 最終的には「フォーム」からフォルダを指定して、全てのファイル名を 取得したいと考えています。 以上、宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
このソースを書けるなら、たぶん、自分で1行ずつなにやってるか見ていけば、理解できるんじゃないかなとおもいます。 欠けているのは、取得したものがディレクトリかどうかの判断と、サブディレクトリだった場合のサブディレクトリの処理ですね。 具体的なソース書かなくても質問者さんならできそうなので、必要な処理を説明します。 サブディレクトリの中にさらにディレクトリがあるなど、階層を考え始めると、ベタに処理を書くのはお勧めできません。 そこで再帰呼び出し(再帰関数)にしてしまうのがよろしいかと。 function get_dir_contents($dir_name) という感じの関数宣言として、 1.$dir_nameを開く 2.$dir_nameの中身を取得 3.2の取得したものを1つ$dir_contentに格納 4.$dir_contentがファイルかディレクトリかチェックし、ファイルなら5-1へ、ディレクトリなら5-2へ 5-1.ファイルの場合に行いたい処理を行う 5-2.$dir_name/$dir_contentを引数としてget_dir_contentsを呼び出す ※$dir_nameの中身の数だけ3以降を繰り返す ※必要な例外チェックは忘れずに つか、書いた方が早いか。 function get_dir_contents($dir_name) { // 引数がディレクトリかチェック if( !is_dir($dir_name) ){ print "error:$dir_name is not directory!"; return 0; } // ディレクトリを開く if( !($handleDir = @OpenDir( $dir_name )) ){ print "error:Not open $dir_name"; return 0; } while( $dir_content = ReadDir( $handleDir ) ){ // 現在のディレクトリか上位ディレクトリはパス if( $dir_content == '.' || $dir_content == '..' ){ continue; } // ディレクトリなら再帰呼び出し if( is_dir( "$dir_name/$dir_content" ) ){ get_dit_contents( "$dir_name/$dir_content" ); }else // ファイル用の処理 if( is_file( "$dir_name/$dir_content" ) ){ $kind = Substr( $dir_content, -3, 3 ); if ( $kind == 'gif' || $kind == 'jpg' || $kind == 'png' ) { print "{$dir_content} <br />\n"; } } } return 1 } まぁ必要があれば、ディレクトリかファイルか以外にもチェックは必要でしょう。 なお、ソースは実証してなくて空で書いたものなので、動作確認はお願いします。 あくまで考え方として書いたので。
その他の回答 (2)
- wp_
- ベストアンサー率54% (132/242)
横道それますが、下記ページを調べるために用いた単語は「php 再帰」。 上から三番目に該当ページが出てきます。 私は再帰というものがどういうものか知っていたからこそたどり付けていたのですよ。 なので、このへんは「調べが足らなかった!」と言うわけではないので 気にせず頑張ってください。 理解が追いつかないようでしたら、No.2の方が書いてくれた処理の手順を 自分なりの図にしてみるとよいですよ。 図の描き方が分からない場合は「フロー図」で検索するとよいです。 いろいろサンプルが転がってます。
- wp_
- ベストアンサー率54% (132/242)
気合入れてサンプル書くぜー よし書いたー でももっといい方法あるかも 調べるかー と思って少しぐぐったらとてもよいサンプルがあった罠。 以下のページが非常に分かりやすいです。 関数を再帰的に呼び出すことでディレクトリをすべて網羅することが出来ます。 僕のコードは電子の藻屑とさせていただきます。orz
お礼
wp_さん ありがとうございます。再帰関数というのがあるんですね。 知りませんでした。もっと調べるべきでした。 申し訳ありません。 参考にさせていただきます。
お礼
kalzeさん ご丁寧にコードまで記述していただきありがとうございます。 コードを見比べて調べてみます。