2012-05-07 3 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] =>)

В противном случае, если я не проверяют кастрированный баран файл является реж используя этот код:

$files = array(); 

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

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

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

это дампов, что ожидали: ([0] => .. [1] => бла [2] => блаблабла [3 ] => index.php [4] => styles.css [5] =>.)

Я предполагаю, что это просто проблема с noob с использованием $ var var в качестве параметра, но не знаю, как заставить его работать.

Спасибо за чтение!

+0

Вам нужен список всех подкаталогов? если так использовать glob() –

+1

Вы, кажется, изобретаете колесо для ['glob (" * ", GLOB_ONLYDIR)'] (http://php.net/glob). Если это так, проблема уже решена;) –

+0

Oks, проблема решена, спасибо вам, ребята, это было довольно быстро, не знали об этой опции glob и относительном пути 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

Проблема: $ file содержит только базовое имя, а не абсолютное имя файла. Так предварять путь к папке:

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++; 
} 
?>