2012-05-07 7 views
1

특정 디렉토리의 모든 파일을 반복하는 동안 is_dir을 사용할 때 문제가 있습니다.is_dir이 예상대로 작동하지 않습니다.

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     if (is_dir($file)) $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

그것은 덤프 : (. [0] =>)

그렇지 않으면 나는 경우, 코드 그래서 나는 내가 그것을 게시 할 경우 당신이 더 무슨 뜻인지 이해할 것 같아요 종류의 작은 ([0] => ... [1] => BLA [2] => blablabla [3 :

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

그것은 예상했던 덤프 : 파일 어떠했는지를 확인하지 않는 것은 DIR이 코드를 사용하는 것 ] => index.php [4] => styles.css [5] =>.)

$ file 변수를 매개 변수로 사용하는 것만으로도 문제가되는 것 같지만 작동시키는 법을 모릅니다.

읽어 주셔서 감사합니다.

+0

모든 하위 디렉토리의 목록을 원하십니까? 그래서 글로브를 사용하는 경우()가 –

+1

당신은 ['글로브 ("*", GLOB_ONLYDIR)'] 대한 바퀴를 개혁 한 것으로 나타났습니다 (http://php.net/glob). 이 경우, 문제가 이미 해결되었다;, –

+0

OKS이 문제가 해결) 너희들 덕분에,이이 글로브 옵션도했던 opendir의 상대 경로에 대해 알고하지 않았나요, 꽤 빨랐다. 감사!! – LuthorMithos

답변

6

가 Kolink 당신이 glob 길을가는 것을 아마 더 좋을 것 같아, 코멘트에 말했듯이, 그러나 당신이했던 opendir을 고수하기로 결정한 경우 :

경로가 될 것입니다 $ 폴더. '/'. $ file이 아니라 $ file. opendir()은 상대 경로를 반환합니다. 따라서 is_dir은 루프에서 false를 반환합니다.

if ($dir = opendir($folder)){ 

    while(false !== ($file = readdir($dir))) { 
     if ($file == '.' || $file == '..') { 
      continue; 
     } else if (is_dir($folder . '/' . $file)) { 
      $files[] = $file; 
     } 
    } 

    closedir($dir);  

} 

또한 false !==에 유의하십시오. 이것은 "0"이라는 폴더가 false (또는 다른 몇 가지 가장자리의 경우)로 평가되기 때문에 필요합니다. 또한 실제로는 ...을 신경 쓰지 않으므로 ...을 필터링하는 코드가 있습니다.

+0

답장을 보내 주셔서 감사합니다. 제가 첫 번째 언급에서 말했듯이 이미 그것을 풀었습니다. – LuthorMithos

4

문제점 : $ 파일에는 절대 파일 이름이 아니라 기본 이름 만 들어 있습니다. 그래서 폴더의 경로를 앞에 추가 :

is_dir($folder . '/' . $file) 
0
<? // findfiles.php - what is in directory "videoarchive" 
$dir = 'images/videoarchive/'; // path from top 
$files = scandir($dir); 
$files_n = count($files); 

echo '<br>There are '.$files_n.' records in directory '.$dir.'<br>' ; 

$i=0; 
while($i<=$files_n){ 
    // "is_dir" only works from top directory, so append the $dir before the file 
    if (is_dir($dir.'/'.$files[$i])){ 
     $MyFileType[$i] = "D" ; // D for Directory 
    } else{ 
     $MyFileType[$i] = "F" ; // F for File 
    } 
    // print itemNo, itemType(D/F) and itemname 
    echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ; 
    $i++; 
} 
?> 
관련 문제