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

时间:2020-03-05 18:50:17  来源:igfitidea点击:

有人遇到过这种奇怪吗?

我正在检查其中一个单元测试中是否存在许多目录。尽管该文件夹在调用时不存在,但is_dir报告为true(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的计算机

我检查过的事情:

- 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个字符以下
我无法想象权限问题,因为该文件夹不存在!父文件夹不会引起权限问题,因为循环中的其他文件夹已正确报告为丢失。

对PHP文档的评论指出了is_dir的奇怪问题,但不是这个特殊的问题。

我并不是将其发布为"请帮助我解决",但希望遇到相同问题的人可以在这里搜索,并希望其他看到此问题的人给出答案!

解决方案

回答

对于它的价值,可以使用is_reading来解决。

回答

我认为这不会引起问题,但是$ path确实有斜杠,对吗?

回答

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

那可能是造成它的原因。我假设$ base是我们正在搜索的某种根文件夹,因此,如果$ uf是类似于'',``。''或者'../'的东西,则可能返回true。我们必须查看我们在foreach中使用的值才能进一步了解任何内容。

[编辑]

多做一些上面的代码可以在带有PHP 5.2的OpenBSD 4.3上正常工作。