对于不存在的文件夹,php is_dir返回true

时间:2008-09-09 19:32:54

标签: php

有没有人遇到这种奇怪的事情?

我正在检查我的一个单元测试中是否存在多个目录。 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 Version 5.2.4-2ubuntu5.3运行Ubuntu Linux 8.04的机器

我检查过的事情:

 - Paths are full paths
 - The 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个字符下都很好   - 由于文件夹不存在,我无法想象权限问题!父文件夹不能导致权限问题,因为循环中的其他文件夹被正确报告为丢失。

关于PHP文档的评论指出了is_dir的奇怪问题,但没有指出这个问题。

我不会将此作为“请帮助我修复”发布,但希望有人遇到同样的事情可以在这里搜索,并希望希望来自其他看过这个的人的答案!< / p>

3 个答案:

答案 0 :(得分:3)

我不认为这会导致你的问题,但$ path确实有尾随斜线,对吗?

答案 1 :(得分:1)

为了它的价值,is_readable可以用作解决方法。

答案 2 :(得分:0)

$path = trim($base . '/' . $uf);

这可能会导致它。我假设$ base是你正在搜索的某种根文件夹,所以如果$ uf就像'','。'或'../'那样可以返回true。我们必须看看你在foreach中使用了什么值才能进一步了解。

[编辑]

在使用PHP 5.2的OpenBSD 4.3上进行更多查看以上代码可以正常工作。