Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Написал скрипт, которой выводит все поддериктории
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Написал скрипт, которой выводит все поддериктории

Страниц (1): [1]
 

1. Bill - 25 Мая, 2013 - 12:25:26 - перейти к сообщению
Здравствуйте

Хочу для опыта написать скрипт который выведет все файлы во всех директориях, любой вложенности.
Работает рекурсивно.

Написал, работает нормально. НО ! Не читает папки дальше второго уровня вложенности.

Т.е. если есть такая папка:

cars
...bmw
...mersedes
...lada


То всё что в cars - скрипт считает файлами, т.е. is_dir - возвращает false.

Помогите понять что не так.
Возможно есть какая нибудь настройка апача или php.ini ?
Вроде бы с точки зрения кода всё верно.
Тестирую на денвере, пробовал заливать на хост - и так и там, дальше второго уровня не распечатывает =(

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function dirs($dir, $tab) {
  4.         $d = opendir($dir);
  5.        
  6.         while( $name = readdir($d) ) {
  7.                 if( $name == "." or $name == ".." ) continue;
  8.                
  9.                 if( is_dir($name) ) {
  10.                         echo "<b>".$tab."[$name]</b><br>";
  11.                         dirs($dir."/$name", $tab. "-");
  12.                 } else
  13.                         echo "$tab$name<br>";
  14.         }
  15.         closedir($d);
  16. }
  17.  
  18. dirs( ".", "" );
  19.  
  20. ?>
  21.  

(Добавление)
Я нашел ошибку!

Если кому интересно - ошибка была в условии.
Скрипт не верно отличал папку от файла, потому что условие в 9 строке было не верным.

Нужно так:
if( is_dir( $dir."/".$name ) ) {
2. DelphinPRO - 25 Мая, 2013 - 12:50:42 - перейти к сообщению
может быть вообще не входит в цикл?

PHP:
скопировать код в буфер обмена
  1. /* Именно этот способ чтения элементов каталога является правильным. */
  2.     while (false !== ($file = readdir($handle))) {
  3.         echo "$file\n";
  4.     }
  5.  
  6.     /* Этот способ НЕВЕРЕН. */
  7.     while ($file = readdir($handle)) {
  8.         echo "$file\n";
  9.     }


php.su пишет:
Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем "0").

(Добавление)
UPD/
Улыбка
но условие всё-таки поменяйте на правильное
3. Bill - 25 Мая, 2013 - 12:55:19 - перейти к сообщению
DelphinPRO Спасибо за информацию, очень помогло!
Оказывается я всегда писал очень не верно.
4. DelphinPRO - 25 Мая, 2013 - 13:01:53 - перейти к сообщению
Bill пишет:
я всегда писал очень не верно.

почаще заглядывайте в мануал http://ru2.php.net/manual/ru/
;)
5. Bill - 25 Мая, 2013 - 13:12:58 - перейти к сообщению
DelphinPRO Спасибо за ссылку!

Я пользуюсь http://www.php.su - он как то понятнее сделан =)
6. DelphinPRO - 25 Мая, 2013 - 15:19:41 - перейти к сообщению
у нас не все данные актуальны. Лучше всё же использовать первоисточник.

 

Powered by ExBB FM 1.0 RC1