PHP подсчет количества файлов (папок) в директории

uncle17

как ведется? По конкретному количеству файлов или в т.ч. по симлинкам на них? Судя по всему, второе.. так и должно быть или это где-то настраивается?
Пример:

$fp=opendir("dir");
while($file=readdir($fp
{
if ($file!="." && $file!="..") {$dirs[]=$file;}
}
closedir($fp);
echo sizeof($dirs);

При

%ls -la
total 10
drwxrwxr-x 5 www 512 15 мар 16:40 .
drwxrwxrwx 6 serg www 1024 28 мар 17:50 ..
drwxr-xr-x 3 www 512 16 фев 14:39 1
drwxr-xr-x 3 www 512 14 фев 17:13 2
drwxr-xr-x 3 www 1024 16 фев 14:39 3

выдает 6. В принципе, всё, конечно, лечится добавлением в условие && is_dir($file но как-то такое поведение было для меня совершенно нелогичным сюрпризом...

artimon

Каталоги и симлинки это тоже файлы, так что всё логично.

uncle17

да я ж не спорю, но симлинки-то физически находятся не в этой директории

artimon

Симлинк это файл и находится он в этой директории. А вот файл на который он ссылается в другой (наверное).

uncle17

в ней пусто, в том-то и дело... ладно, пофиг. Просто на будущее буду вставлять лишнее условие:)

artimon

Что значит „в ней пусто“?
Нихрена не понял. Ты можешь выражаться яснее?

uncle17

симлинков в ней нет никаких. На нее саму (точнее, вовсе на /usr/local/www) в корне лежит симлинк, а в текущей дире есть только диры ., .., 1, 2, 3

artimon

Т.е. echo sizeof($dirs); выдаёт 6, хотя в каталоге есть только три подкаталога и больше ничего? Посмотри на var_dump($dirs); и найди лишнее.

uncle17

вот на этом я, собственно, проблему и обнаружил.
array(6) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "1" [4]=> string(1) "2" [5]=> string(1) "3" }
Как бы дважды проходит по папке...

artimon

А ты перед циклом очистить $dirs не пробовал?

uncle17

так он у меня только там и создается... или имеешь в виду, что дескрипторы открытые с прошлого запуска остаются?
Оставить комментарий
Имя или ник:
Комментарий: