誰もこの奇妙なことに遭遇しましたか?php is_dirは、存在しないフォルダの場合はtrueを返します
私のユニットテストの1つにいくつかのディレクトリが存在するかどうかチェックしています。 is_dir
は、呼び出された時点でフォルダが存在しないにもかかわらず、真(1)を報告しています。
foreach($userfolders as $uf) {
$uf = sprintf($uf, $user_id);
$uf = ltrim($uf,'/');
$path = trim($base . '/' . $uf);
$res = is_dir($path); //returns false except last time returns 1
$this->assertFalse($res, $path);
}
マシンはPHPバージョン5.2.4-2ubuntu5.3
物事私がチェックしているとUbuntu Linuxの8.04を実行している:コードは、(デバッグを容易にするために、いくつかの余分な中間VARSで)このようになります
- Paths are full paths
- Same thing happens on two separate machines (both running Ubuntu)
- I have stepped through line by line in a debugger
- Paths genuinely don't exist at the point where is_dir is called
- While the code is paused on this line, I can actually drop to a shell and run
インタラクティブなPHPインタプリタと正しい結果を得る - パスはすべて256文字以下である - フォルダが存在しないため、権限の問題は想像できません!親フォルダは、ループ内の他のフォルダが欠落していると正しく報告されているため、アクセス権の問題を引き起こすことはできません。
is_dir
での奇妙な問題を指しているPHPドキュメントのコメントですが、この特定のものはありません。
私は「助けてください」と投稿しているわけではありませんが、同じことに遭遇した誰かがここで検索できるように、そしてうまくいけば誰かからの答えがこれを見ました!
素晴らしい。私の道には後ろにスラッシュがありませんでした。私はそれらに後続のスラッシュが必要であるとは思っていませんでした: - 私は習慣的に後にスラッシュを追加することは決してありません。同じテストセットで
is_dir
を他のすべての用途で使用していたのはOKですが(面白いことに、他の1つの使用法は、同じ存在しないフォルダ名で全く同じ方法で失敗しました)。 - また、PHPマニュアルのis_dir
コード例では、後ろにスラッシュを使用していません。 - 確かに、後にスラッシュを必要とすることはできませんでした。それはis_dirテストのポイントをほぼ克服するものですか? –あなたはオーウェンズのことを知っていますか?あなたは絶対に正しいです。さらにテストでは、末尾のスラッシュをすべてのパスに追加すると、
is_dir
が動作することがわかります。非常に奇妙な行動。そして再び、SOはそれ自体が非常に貴重であることを証明します。したがって、要約すると、PHPでis_dir
に奇妙な問題が発生している場合は、パスの末尾にスラッシュが付いていないか、またはis_readable
に切り替えてください。 –