• ベストアンサー

ファイルとディレクトリの見分け方は?

環境  WindowsXP、Apache2.0.47、PHP4.3.2で使用しています。 質問  関数readdir($dh)で指定されたパスのファイルとディレクトリのリストを取得しています。  両方が存在していた場合、ファイルとディレクトリを見分けるためにはどのようにしたら良いのでしょうか?  都合の良い関数は無いように思ったのですが... よろしくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>残念ながら今回も思ったとおりには行きませんでした。 変ですね~。 プログラム的には、$filenameが取り出せていることから特別問題がなくて、 is_file()の動作がおかしいということですね。 日本語のファイル名がうまく読めない (例えば、OSとAPACHEとPHPで文字コードが違うとか) いうことではないですよね。 is_fileが使えないということであれば filetype関数を使ってみたらどうでしょう。 if("file"==filetype($filename)){ の様にファイルの種類がファイルだったら文字列で"file"を返します。 また、ディレクトリの場合は"dir"になります。 これでもおかしいなら 例えば、 $ftype=filetype($filename); としておいて、 if($ftype=="file"){ }elseif($ftype=="dir"){ }else{ print "$filenameの種類は:$ftype\n"; } とでもして原因を探りましょう

wipe
質問者

お礼

いつも回答ありがとうございます。 日本語のファイル名が読めないということはなさそうです。readdirでは日本語を読めているようですし、半角英数字でも現象はおなじです。 アドバイスいただいたように、原因を探ってみたのですか分かりませんでした。 先に進まないので別の作業をしていたのですが、他の回答から原因が分かりました。 これまでいろいろ回答・アドバイスをいただき本当に感謝しています。 ありがとうございました。

その他の回答 (5)

  • streetpb
  • ベストアンサー率0% (0/1)
回答No.6

私のWindows98SEのPCでは、 is_file($filename) is_dir($filename) は、$filenameにフルパスを指定すると正常に動作します。 $filenamefull = $dir . '/' . $filename; is_file($filenamefull) is_dir($filenamefull) こんな具合です。 「readdir($dh)」はファイル名だけを取得し、 is_file(), is_dir()はパスを指定しないと、カレントDIRを使用してるようです。 関係無ければ、ごめん。

wipe
質問者

お礼

回答ありがとうございます。 いただいた内容を確認したところ、動作いたししました。 readdirではパス指定しておりましたが、is_file、is_dirでは指定していませんでした。 原因が分からずしばらく立ち止まっていましたが、ようやく先にすすめそうです。 神の一声のような回答でした。 本当にありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>ファイル=なし、ディレクトリ=2(.と..)になります。 例えば、下のようにしてこちらの環境では期待通り動きます。 opendirは、ちゃんとできているのでしょうか? 最初(#1)のコメントからすると、ファイルは読み出しできていたはずだと思うのですが… なんだったら、ifでファイルとディレクトリの検査をする前に print "$filename\n"; して ファイル名がちゃんと取り出せているか調べる必要があるかもしれません。 ---------------------- 修正済みプログラム($dirは直して下さい。) ---------------------- <?php $dir = "/work/sample/php/"; $dh = opendir($dir); while(false !== ($filename = readdir($dh))) { if(is_file($filename)){ $file[] = $filename; print "file = $filename\n"; } if(is_dir($filename)){ $folder[] = $filename; print "folder = $filename\n"; } } closedir($dh); ?>

wipe
質問者

お礼

いつも回答ありがとうございます。 残念ながら今回も思ったとおりには行きませんでした。 $dirで参照したディレクトリ内にはディレクトリとファイルが1つずつあり、ちゃんと取り出せていたのですが、if文を使うと思うようにいきません。 PHP4.3.2の設定に問題でもあるのでしょうか? よろしくお願いします。

wipe
質問者

補足

上記の修正プログラムの結果ですが下のようになりました。  folder = . folder = .. print "$filename\n";で調べたところファイル名は取り出せていました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>if(!is_file($filename)){ >if(!is_dir($filename)){ if(is_file($filename)){ if(is_dir($filename)){ にしないと、意味が逆になってしまいます。 (ファイルでない、フォルダでない)

wipe
質問者

お礼

返事がだいぶ遅くなってしまいました。 いつも回答ありがとうございます。 しばらくPHPの使えない環境でいました。 今はOS・Linuxにて本稼動の準備に入っていますが、 いまだに原因が分かりません。 よろしくお願いします。

wipe
質問者

補足

回答のようにソースを書きますと ファイル=なし、ディレクトリ=2(.と..)になります。 なぜでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>is_fileでTRUEになったもの 「.」「..」「test.php」「testフォルダ」 >is_dirでTRUEになったもの 「test.php」「testフォルダ」でした。 それ、変ですね。 どんな、コードを書いたのか見せて貰えませんか?

wipe
質問者

補足

回答ありがとうございます。 以下のようなコードで確認いたしました。 コメントアウトしているif文は当初のコード、その中に書かれているコードが今回確認用に追加したものです。 //保存フォルダ参照 $dir = "test/rom_file/$id"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { //if ($filename != "." && $filename != "..") { //$file[] = $filename; if(!is_file($filename)){ $file[] = $filename; print "file = $filename"; } if(!is_dir($filename)){ $folder[] = $filename; print "folder = $filename"; } //} } phpの関数リファレンスでも確認しましたが、間違っていないように思ったのですが... よろしくお願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

$file=readdir($dh) として読み出したら is_file($file) または、 is_dir($file) でファイルかディレクトリか調べることができます。 それぞれ、ファイル、ディレクトリの時TRUEになります

wipe
質問者

お礼

回答ありがとうございます。 明瞭かつ簡潔な回答で感謝します。 何となく見覚えのある関数でしたが、いざ使うときに思い出せませんでした。 ありがとうございました。

wipe
質問者

補足

お礼を書いたあとに申し訳ありませんが... 検索ディレクトリ内にtest.phpとtestフォルダを作り、readdirで読み出した内容を確認した結果、 is_fileでTRUEになったもの 「.」「..」「test.php」「testフォルダ」 is_dirでTRUEになったもの 「test.php」「testフォルダ」でした。 is_fileでTRUE=「test.php」、is_dirでTRUE=「testフォルダ」をイメージしていたのですが...。 私の解釈の仕方がおかしいでしょうか?

関連するQ&A