2013-10-05 96 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的替換函數是否會運行?使性能參數無效? –