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] => . )

Я предполагаю, что это просто какая-то нубская проблема с использованием переменной $file в качестве параметра, но я не знаю, как заставить ее работать.

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


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 требует полный путь к файлу/каталогу в качестве аргумента. Проверьте, что вы получаете в $file. Если вы получаете только имя файла, вы добавляете путь к родительскому каталогу   -  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