嵌套时PHP is_dir()不起作用

时间:2013-10-05 15:42:10

标签: php

这是我的文件夹结构:

main 
- folder_1
-- folder_1_1
-- folder_1_2
-- folder_1_3
- folder_2
-- folder_2_1
-- folder_2_2
-- folder_2_3

这是我的代码:

<?php

$mainfolder ="main";

function readDirs($mainfolder){
    if(hasSubFolder($mainfolder)){
        echo("$mainfolder HAS sub folder");
    }else{  
        echo("$mainfolder DOESN'T HAVE sub folder");
    }   
}

function hasSubFolder($folder){ 
    $newPath="";
    if (is_dir($folder)) {  
        echo ("$folder IS a folder</br>"); 
        $handle = opendir($folder);
        while (false !== ($entry = readdir($handle))) {
            $newPath = $folder."\\".$entry;
            if (is_dir($newPath)){
                echo "$newPath IS a folder</br>";
            } else {                
                echo "$newPath IS NOT a folder</br>";
            }
        }       
    }   
}

readDirs($mainfolder);

?>

这就是我得到的:

main IS a folder
main\. is NOT a folder
main\.. is NOT a folder
main\folder_1 is NOT a folder
main\folder_2 is NOT a folder
main DOESN'T HAVE sub folder

所以我想知道为什么“if(is_dir($ newPath))”没有返回true,即使$ newPath是一个文件夹/ dir。是因为它嵌套在另一个is_dir()吗?

感谢

2 个答案:

答案 0 :(得分:5)

由于PHP可以在多个平台上运行,这些平台可能使用比前向或反向斜杠更奇特的目录分隔符,因此可以使用一个漂亮的系统常量来代替:DIRECTORY_SEPARATOR

它自动包含当前主机操作系统的正确分隔符,例如Windows的反斜杠或* nix系统的正斜杠。然后您可以使用:

$newPath = $folder.DIRECTORY_SEPARATOR.$entry;

这比任何操作系统的硬编码都强始终更好,正如其他答案所暗示的那样。

目前,出于向后兼容性的原因,PHP内部始终在其内部文件功能中从str_replace/执行DIRECTORY_SEPARATOR,但这并不能保证永远保持工作 - 这需要花费表现并非严格要求。

答案 1 :(得分:4)

Linux使用/进行文件夹分离,而Windows也是如此。只有DOS没有。将\\替换为/,您应该好好去。