• ベストアンサー

サブディレクトリ内の参照

サブディレクトリ内のファイル名の取得方法について教えてください。 <?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フォルダ内の画像ファイル名は取得できる のですが、サブフォルダ内のファイル名の取得ができません。 コード不足などであれば、そちらを教えていただければと思います。 最終的には「フォーム」からフォルダを指定して、全てのファイル名を 取得したいと考えています。 以上、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kalze
  • ベストアンサー率47% (522/1092)
回答No.2

このソースを書けるなら、たぶん、自分で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 } まぁ必要があれば、ディレクトリかファイルか以外にもチェックは必要でしょう。 なお、ソースは実証してなくて空で書いたものなので、動作確認はお願いします。 あくまで考え方として書いたので。

ken0109
質問者

お礼

kalzeさん ご丁寧にコードまで記述していただきありがとうございます。 コードを見比べて調べてみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

横道それますが、下記ページを調べるために用いた単語は「php 再帰」。 上から三番目に該当ページが出てきます。 私は再帰というものがどういうものか知っていたからこそたどり付けていたのですよ。 なので、このへんは「調べが足らなかった!」と言うわけではないので 気にせず頑張ってください。 理解が追いつかないようでしたら、No.2の方が書いてくれた処理の手順を 自分なりの図にしてみるとよいですよ。 図の描き方が分からない場合は「フロー図」で検索するとよいです。 いろいろサンプルが転がってます。

全文を見る
すると、全ての回答が全文表示されます。
  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

気合入れてサンプル書くぜー よし書いたー でももっといい方法あるかも 調べるかー と思って少しぐぐったらとてもよいサンプルがあった罠。 以下のページが非常に分かりやすいです。 関数を再帰的に呼び出すことでディレクトリをすべて網羅することが出来ます。 僕のコードは電子の藻屑とさせていただきます。orz

参考URL:
http://itpro.nikkeibp.co.jp/article/COLUMN/20070827/280408/
ken0109
質問者

お礼

wp_さん ありがとうございます。再帰関数というのがあるんですね。 知りませんでした。もっと調べるべきでした。 申し訳ありません。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ディレクトリ名を取得したい

    perlでディレクトリ名だけを取得したいのですが、 なかなかうまい方法が見つかりません。 ファイル名を取得する・・・というのは結構あるのですが、 ディレクトリ名だけ、というのがどうもわかりません。 ちなみにファイル名取得は以下のようにやっています。 my $md; opendir(DIR, 'q'); while (defined($dir = readdir(DIR))) { $md=substr($dir,0,6); } closedir(DIR); ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

    • ベストアンサー
    • Perl
  • ディレクトリ内の最新の画像のみ表示したい。

    ディレクトリファイルから画像ファイルの更新日時を取得して、 拡張子を問わず、最新の画像のみ表示させたいのですが、 うまく出来ません。ご教授お願いします。 ~・~・~・~・~・~・~ <?php $dir = @opendir("****"); while($file = readdir($dir)) { $kaku = substr($file, -3, 3); if($kaku=="jpg" || $kaku=="gif" || $kaku=="png"){ $cnt++; $last = date("ymdHis", filemtime($file)); $img="$last$file"; $filename[$cnt]=$file; } } closedir($dir); } arsort($img); $img_file= substr($img, 12); $cnt=0; foreach($img_file as $value){ $cnt++; if ($cnt<=1){ echo "<img src=\"$value\">"; } } ?>

    • ベストアンサー
    • PHP
  • Perl で ディレクトリ及びサブディレクトリの容量を取得したい

    Perlについて質問します。 Perlで特定のディレクトリ及び、サブディレクトリ全てのファイルの容量を取得する方法についてです。 opendir、readdir関数を使用し指定した階層の合計が表示できたが、それより1つ下の、サブディレクトリはファイルを読み込めませんでした。 どうすればサブディレクトリのファイルも読み込んでもらえるでしょうか。 よろしくお願いします。

  • フォルダ内のファイル名取得の仕方が分かりません

    Apache2.0.47、PHP4.3.2で使用しています。 フォルダ内のファイル名の取得を以下のように書いています。 (scandirは使えませんでした) <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); print_r($files); ?> "."と".."も取得されるので、以下のように変更したのですが同じ結果でした。 <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if(filename!=". "){ if(filename!=".. "){ $file[] = $filename; } } } sort($files); print_r($files); ?> "."と".."をはぶいたファイル名だけを取得したい場合にはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • フォルダ内のファイル名を取得して配列にぶち込みたいです

    こんにちは。 フォルダ内ファイル名を一覧にして表示させることまでは出来ますが、 この一覧表示されたファイル名を配列に入れるにはどうしたらよいでしょうか。 <?php $dir = "sample/"; // ディレクトリの内容を読み込みます。 if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: " . $file . "<br />\n"; } closedir($dh); } ?> ご教示宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでディレクトリーとそのサブディレクトリー表示

    PHPでディレクトリーとそのサブディレクトリーの中のファイルを表示して、ファイルであればダウンロード用のリンクを付け加えたいと思いますが、ここで嵌ってしまっています。 以下はソースコード(コメントアウトされている部分は試したコード、すべてだめだった) $dir = $_SERVER['DOCUMENT_ROOT'].'/projects/website/uploaded'.'/'.$_GET['user']; function getDirContents($dir) { global $basedir; $path=pathinfo($dir); $path1=$basedir.'/'.basename($dir); //echo $path1; //$path1=basename($dir); if (is_dir($dir)) { //$path1 .= basename($dir); //$path1 .='/'.basename($dir); $dirs = explode('/', $dir); $last_dir = $dirs[count($dirs) - 1]; echo '<strong>'.$last_dir.'</strong>'; if ($dh = opendir($dir)) { echo '<ul>'; while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..' || substr($file,0,1)=='.') {} else { echo '<li>'; if (is_dir($dir.'/'.$file)) { $path1 .='/'.basename($file); getDirContents($dir.'/'.$file); } else { //echo $path1; $path2=pathinfo($path1); echo '<a href="'.$basedir.$path1.'/'.$file.'">'.$file.'</a>'; } echo '</li>'; } } echo '</ul>'; closedir($dh); } } return false; } getDirContents($dir); 因みにウェブサイトは、サーバーの/projects/website/にあります。表示したいフォルダはprojects/website/uploaded/にあります。そしてサブフォルだは/projects/website/uploaded/(ユーザ名)/(フォーム番号)/ わかる方がいらっしゃいましたら、ご回答を宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラム

    PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラムで「test」というディレクトリ内のファイル一覧(ディレクトリ名とファイル名)を表示するようにしているのですが、この中からディレクトリ名のみ表示させたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 <?php if ($dir = opendir("test/")) { while (($file = readdir($dir)) !== false) { if ($file != "." && $file != "..") { echo "$file<br>\n"; } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • 最新のファイルのみ検索

    サーバー内のファイルを検索するのにKentWebさんのwwwsrch.cgiを利用しています。 # # すべてのファイルをなめ回す # sub search1 { local($dir) = $_[0]; local(@filelist, $file, $filename); opendir(DIR, $dir); @filelist = readdir(DIR); closedir(DIR); foreach $file (@filelist) { if ($file eq ".") { next; } if ($file eq "..") { next; } $filename = "$dir/$file"; if (-d $filename) { if ($recursive_flag) { &search1($filename); } } else { &search2($filename, $dir); } } } # # ファイルの中身を検索する # # 指定していない拡張子のファイルは無視する $suffix = ".html .cgi .pl"; $fname = substr($target, rindex($target, ".")); if ($suffix{$fname} != 1) { return; } ↑の条件に30日以上古いファイルを無視するように改造することはできないでしょうか? 検索対象ファイルが数十万以上と莫大に増加してきたため、最新のファイルのみ検索対象にできればと考えております。

    • ベストアンサー
    • Perl
  • ディレクトリ内の最新ファイルのみをコピーが上手くいかない

    下記のようなスクリプトにより、 ./ディレクトリ内の更新日付が最新のファイル名を取得し、 そのファイルを./bbbディレクトリにコピーするということを行いたいのですが、 更新日付が最新のものに関わらず全てのファイルがコピーされてしまいます。 <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $to="./bbb/".$fnm; if(!file_exists($to)) copy("./".$fnm,$to); } } closedir($dir); ?> 自力ではどこがヘンなのか理解できないため、どなたか教えてください。

    • ベストアンサー
    • PHP
  • PHPのopendir関数って・・・。

    <?php $dir = "/etc/php5/"; // 既知のディレクトリをオープンし、その内容を読み込みます。 if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?> 上の例の出力は、たとえば以下のようになります。 filename: . : filetype: dir filename: .. : filetype: dir filename: apache : filetype: dir filename: cgi : filetype: dir filename: cli : filetype: dir とありますが、 filename: . : filetype: dir filename: .. : filetype: dir は何もフォルダになくても出ますよね? これは何ですか??

    • ベストアンサー
    • PHP