readdir函数没有读取linux系统上的整个目录

时间:2015-07-07 10:07:51

标签: php linux

在我的托管服务提供商上,我有一个名为hosts的目录,其结构类似于

   .
├── hosts.php
├── ma_man_com.php
└── ma_women_com.php

0 directories, 3 files

hosts.php文件的内容是这个

<?php

$folderhost = opendir ( "./" );
$hosy = readdir ( $folderhost );
while ( $hostname = readdir ( $folderhost ) ) {
    echo $hostname.PHP_EOL;

}
closedir ( $folderhost );
?>

当我运行hosts.php时,我得到此输出

 .
..
hosts.php
ma_man_com.php

所以php没有显示ma_women_com.php

如果我从hosts.php

删除了这个无用的行
$hosy = readdir ( $folderhost );

输出正常,可以读取ma_women_com.php

此外,如果我删除其中一个文件的信件,例如将ma_women_com.php重命名为ma_women_co.php

然后输出也很好

最奇怪的是,使用Windows 7和xampp服务器的本地主机上不存在此行为

我知道我从代码中删除的行是无用的,我可以简单地删除它,问题就会解决但我很好奇为什么会发生这种情况以及为什么它只发生在openshift linux服务器上?

4 个答案:

答案 0 :(得分:1)

这是因为你在这一行打电话给第一次阅读:$hosy = readdir ( $folderhost );

答案 1 :(得分:1)

每次调用readdir()都会读取一个文件名,然后继续执行下一个文件名。所以&#34;无用&#34; line读取目录中的第一个文件名而不打印它,然后循环读取并打印剩余的文件名。

答案 2 :(得分:1)

带有额外readdir的代码会跳过第一个条目读取;因为readdir以任意顺序读取文件并且它与平台有关,所以这意味着在一个平台上,您可以跳过.,在其他平台上跳过特定文件;另请注意,如果您更改目录中的某些内容,文件的顺序可能会发生变化,例如:重命名一个文件,这显然是从文件名中删除一个字母时发生的事情。

答案 3 :(得分:1)

该行不仅无用,而且确实会读取您未使用的条目,因此这就是您没有看到其中一个文件的原因。

我猜这也发生在你的Windows环境中,你只是因为文件的顺序而没有注意到它。我认为在Windows上第一个(你没打印的那个)实际上是“。”,你的输出以“..”开头。