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] => bla [2] => blablabla [3] =>index.php [4] => styles.css [5] => . )

Предполагам, че това е просто проблем на noob с използването на $file var като параметър, но не знам как да го накарам да работи.

Благодаря за четенето!


person LuthorMithos    schedule 07.05.2012    source източник
comment
искате ли просто списък с всички поддиректории? ако е така, използвайте glob()   -  person    schedule 08.05.2012
comment
Изглежда, че преоткривате колелото за glob("*",GLOB_ONLYDIR). Ако това е така, проблемът вече е решен ;)   -  person Niet the Dark Absol    schedule 08.05.2012
comment
Добре, проблемът е решен, благодарение на вас, момчета, това беше доста бързо. Не знаех за тази glob опция, нито за относителния път на opendir. Благодаря!!   -  person LuthorMithos    schedule 08.05.2012
comment
. и .. са специални директории, които се появяват автоматично във ВСЯКА директория. . = текуща директория, .. = родителска директория. Освен ако не ги филтрирате, те винаги ще се показват в opendir/readdir.   -  person Marc B    schedule 08.05.2012
comment
функцията is_dir иска пълен път към файл/директория като аргумент. Проверете това, което получавате във файла $. Ако получавате само име на файл, тогава добавяте пътя към родителската директория   -  person Rajan Rawal    schedule 08.05.2012


Отговори (2)


Както Колинк каза в коментарите, вероятно е по-добре да тръгнете по маршрута glob, но ако решите да се придържате към opendir:

Пътят ще бъде $folder. '/' . $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 (или няколко други крайни случая). Освен това много рядко наистина ще се интересувате от . и .., така че този код е там, за да филтрира . и ...

person Corbin    schedule 07.05.2012
comment
Благодаря и на теб за отговора. Вече го реших, както казах в първия коментар. - person LuthorMithos; 08.05.2012

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

is_dir($folder . '/' . $file)
person Niko    schedule 07.05.2012