2013-10-05 2 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 

그래서 나는 왜 "(is_dir ($ newPath))"가 $ newPath가/dir 인 경우에도 true를 반환하지 않는 이유를 알고 싶습니다. 다른 is_dir() 안에 중첩되어 있기 때문입니까?

감사

답변

4

리눅스는 폴더 분리 / 사용 및 Windows도한다. 그렇지 않은 것은 DOS뿐입니다. \\/으로 바꿔야합니다.

+0

와우, 그게 간단합니까? 정말 고맙습니다. –

+0

WTH ?? 이 메시지는 "5 분 안에 대답을 수락 할 수 있습니다.":) 나중에 다시 와야 할 것 같네요. –

5

PHP는 정방향 또는 역방향 슬래시보다 훨씬 복잡한 이식성있는 디렉토리 분리자를 사용할 수 있으므로, 대신 사용할 수있는 아름다운 시스템 상수가 있습니다 (DIRECTORY_SEPARATOR).

Windows의 경우 백 슬래시 또는 * nix 시스템의 슬래시와 같이 현재 호스트 OS의 올바른 구분 기호를 자동으로 포함합니다. 그런 다음 사용할 수 있습니다

$newPath = $folder.DIRECTORY_SEPARATOR.$entry; 

이 다른 대답에서 알 수 있듯이 어떤 OS를 위해 그것을 하드 코딩보다 항상입니다.

현재, 이전 버전과의 호환성을 위해, PHP는 내부적으로 항상 내부 파일 기능에서 DIRECTORY_SEPARATOR/에서 str_replace을 수행하지만이 영원히 작업을 계속 보장 할 수 없습니다 - 그것은 성능을 요하고 엄격하게 필요하지 않습니다.

+0

FYI [Wikipedia] (http://en.wikipedia.org/wiki/Path_ (computing)) 디렉토리 구분자의 좋은 컴파일. – ComFreek

+0

PHP가 내부적으로 그렇게한다면, DIRECTORY_SEPARATOR가'/'이면 str 대체 함수가 실행되지 않으므로 성능 인수가 유효하지 않게됩니까? –