2013-10-05 64 views
1

时,这里是我的文件夹结构不起作用:PHP is_dir()嵌套

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是一个文件夹/目录。是因为它嵌套在另一个is_dir()中吗?

感谢

回答

4

Linux使用/的文件夹分离,Windows不会太大。只有DOS才没有。将\\替换为/,您应该很好。

+0

哇,这很简单吗?非常感谢。 –

+0

WTH ??这个消息“你可以在5分钟内接受答案”:)我想我必须回来以后:) –

5

由于PHP可以在多种平台上运行,这些平台可能使用比向前或向后斜杠更加奇特的目录分隔符,因此可以使用定义的漂亮的系统常量:DIRECTORY_SEPARATOR

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

$newPath = $folder.DIRECTORY_SEPARATOR.$entry; 

这是总是不是对方的回答表明硬编码任何操作系统更好。

目前,为了向下兼容的原因,PHP内部总是这样从一个/str_replace其内部文件的功能内DIRECTORY_SEPARATOR,但是这不能保证永远保持工作 - 它的成本性能,而且不严格必要的。

+0

FYI [Wikipedia](http://en.wikipedia.org/wiki/Path_(computing))有一个很好的编目目录分隔符。 – ComFreek

+0

如果PHP在内部执行该操作,如果DIRECTORY_SEPARATOR为'/',那么str的替换函数是否会运行?使性能参数无效? –