電子書籍の厳選無料作品が豊富!

環境
 WindowsXP、Apache2.0.47、PHP4.3.2で使用しています。

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

よろしくお願いします。

A 回答 (6件)

>残念ながら今回も思ったとおりには行きませんでした。


変ですね~。
プログラム的には、$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";
}
とでもして原因を探りましょう
    • good
    • 0
この回答へのお礼

いつも回答ありがとうございます。

日本語のファイル名が読めないということはなさそうです。readdirでは日本語を読めているようですし、半角英数字でも現象はおなじです。

アドバイスいただいたように、原因を探ってみたのですか分かりませんでした。

先に進まないので別の作業をしていたのですが、他の回答から原因が分かりました。

これまでいろいろ回答・アドバイスをいただき本当に感謝しています。
ありがとうございました。

お礼日時:2005/01/27 09:13

私の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を使用してるようです。

関係無ければ、ごめん。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

いただいた内容を確認したところ、動作いたししました。
readdirではパス指定しておりましたが、is_file、is_dirでは指定していませんでした。

原因が分からずしばらく立ち止まっていましたが、ようやく先にすすめそうです。
神の一声のような回答でした。

本当にありがとうございました。

お礼日時:2005/01/27 12:52

>ファイル=なし、ディレクトリ=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);
?>

この回答への補足

上記の修正プログラムの結果ですが下のようになりました。

 folder = . folder = ..

print "$filename\n";で調べたところファイル名は取り出せていました。

補足日時:2005/01/11 10:52
    • good
    • 0
この回答へのお礼

いつも回答ありがとうございます。

残念ながら今回も思ったとおりには行きませんでした。
$dirで参照したディレクトリ内にはディレクトリとファイルが1つずつあり、ちゃんと取り出せていたのですが、if文を使うと思うようにいきません。

PHP4.3.2の設定に問題でもあるのでしょうか?

よろしくお願いします。

お礼日時:2005/01/11 11:01

>if(!is_file($filename)){


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

この回答への補足

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

補足日時:2005/01/07 16:46
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/07 16:52

>is_fileでTRUEになったもの 「.」「..」「test.php」「testフォルダ」


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

この回答への補足

回答ありがとうございます。
以下のようなコードで確認いたしました。
コメントアウトしている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の関数リファレンスでも確認しましたが、間違っていないように思ったのですが...
よろしくお願いします。

補足日時:2004/12/03 10:09
    • good
    • 0

$file=readdir($dh)


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

この回答への補足

お礼を書いたあとに申し訳ありませんが...

検索ディレクトリ内に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フォルダ」をイメージしていたのですが...。

私の解釈の仕方がおかしいでしょうか?

補足日時:2004/12/02 14:52
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

ありがとうございました。

お礼日時:2004/12/02 13:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!