Листинг всех директорий сервера

Ugnich_Andrey

Новичок
Листинг всех директорий сервера

Добрый день!

Подскажите пожалуйста как мне можно создать полный листинг директорий сервера?
На выходе должно быть:

List of directories for /www/html/:
dir1/
dir1/subdir1.1/
dir1/subdir1.2/
dir1/subdir1.3/
dir2/
dir2/subdir2.1/
dir2/subdir2.2/
dir2/subdir2.2/subsubdir2.2.1/
dir2/subdir2.2/subsubdir2.2.2/
dir2/subdir2.2/subsubdir2.2.2/
dir3/
.....
------
Может есть какая-то PHP-утилитка или функция?
Спасибо.
 

Ugnich_Andrey

Новичок
Я знаю что рекурсия.... но принцип этой рекурсии не могу понять...
01 открыть dir1/
02 прочитать dir1/
03 если каталоги в dir1/ есть - то прочитать 1 каталог
04 ....

Дальше я запутался - потом ведь мне каталоги еще выше нужно будет тоже прочитать.
Я нашел
$tree = glob($path.'*');

но почему-то эта конструкция мне упорно ничего не выдает...
 

WP

^_^
Автор жжот... чё тут понимать?
Функция1 (путь до каталога)
{
открываем каталог "путь до каталога".
читаем, и если попался каталог, выполняем Функция1 (путь до каталога + название попавшегося). И выполняем нужные действия (например, вывода на экран).
}
 

Ugnich_Andrey

Новичок
ок.
Согласен.
А как по поводу перехода на уровень вверх если мы уже оказались в

dir1/subdir1.1/subdir1.1.1/subdir1.1.1.1/

?
Вот мы нашли subdir1.1.1.1, но теперь надо просканировать subdir1.1.1 и выше...
Не могу я понять... помогите пожалуйста.
 

Tor

Новичок
Ugnich_Andrey

давай ты не будешь фантазировать, а сделаешь как тебе говорят
 

Ugnich_Andrey

Новичок
Код:
function show_tree($path){
	$handle = opendir($path);
	while (false !== ($dir_name = readdir($handle))) {
       if(is_dir($filename)){
		   //$path = ;
		   show_tree($path.$dir_name);
	   }
		   echo $path."<br>";
   }

}
show_tree("/");
Выводит кучу косых черт. В чем я не прав?

-~{}~ 06.06.06 19:20:

В догонку - делал так еще:
$path = $path.$dir_name;
show_tree($path);
(это к закомментированной строке)

Результат тот-же.
 

StUV

Rotaredom
Ugnich_Andrey
смотрим первый ответ WP, идем по ссылке и смотрим каменты...
 

Gorynych

Посетитель PHP-Клуба
что типа этого:
Код:
/**
    $dirName - имя директории
    $maxDepth - максимальный уровень вложенности
    $depth - текущий уровень вложенности. 
                  Значение НЕ задается, используется при 
                  формировании рекурсии
**/
function browseDir($dirName, $maxDepth = null, $depth = 0) {
    // Если указан максимально допустимый уровень вложенности
    // и достигнут максимум - выход
    if ( isset($maxDepth) && $depth >= $maxDepth ) {
        return array();
    }

    $subdirectories = array(); // подкаталоги
    $files = array();                 // файлы
    $list = array();                  // результирующий массив

    if (is_dir($dirName) && is_readable($dirName)) {
        $d = dir($dirName);
        while (false !== ($f = $d->read())) {
            // пропускаем '.' и '..'
            if (('.' == $f) || ('..' == $f)) {
                continue;
            }

            // Если это подкаталог - добавляем его в $subdirectories
            if (is_dir("$dirName/$f")) {
                array_push($subdirectories,"$dirName/$f");
            } else {
            // Иначе - это файл, добавляем его в $files
                array_push($files, array('location'=>"$dirName/$f", 'items'=>false));
            }
        }
        $d->close();

         // Рекурсивный обход найденных подкаталогов
        foreach ($subdirectories as $subdirectory) {
            $list[] = array(
                'location'=>$subdirectory."/",
                'items' => browseDir($subdirectory,$maxDepth,$depth+1)
            );
        }
    }

    return array_merge($list,$files);
}

var_dump(browseDir(dirname(__FILE__)));
Функция возвращает массив с элементами вида:

array(2) {
["location"]=> путь_к_файлу_или_каталогу
["items"]=> FALSE, если это файл|массив подэлементов, если это каталог
}
 

StUV

Rotaredom
Ugnich_Andrey
[m]readdir[/m]
3-й камент - ответ на твой вопрос

а если посмотришь и разберешь все примеры - то поймешь как это работает
 

Gorynych

Посетитель PHP-Клуба
Ugnich_Andrey


спасибо много. Попробуй разобраться в логике.
 

Фанат

oncle terrible
Команда форума
как показывает практика, данный призыв никогда не принимается всерьёз.
так что не стоило даже тратьи время на его написание.
Если ты дал код - можешь больше вообще ничего не писать. тебя в упор не увидят.
 

Ugnich_Andrey

Новичок
2Gorynych
Увидел, разберусь сегодня.

2 Фанат
Конечно можно просто стащить функцию, но мне то понять нужно.
Признаться, я не понимаю как работают рекурсивные функции. Я понимаю что они работают. И что они простые. Но когда надо написать такую функцию...
Буду разбираться.
Еще раз всем большое спасибо.
 

Гравицапа

elbirret elcno
Ugnich_Andrey

Википедия, свободная энциклопедия [Электронный ресурс] : Рекурсия, вариант 1266628, последняя правка 4 июня 2006, 17:10 UTC / Авторы Википедии. — Электрон. дан. — Штат Флорида. : Фонд Викимедиа, 2006. — Режим доступа: http://ru.wikipedia.org/w/index.php?title=Рекурсия&oldid=1266628
 

Фанат

oncle terrible
Команда форума
Ugnich_Andrey
Вообще-то, в логике ты разобрался.
раз написал свою.
просто она не работает, но к рекурсивности это не имеет никакого отношения - всего лишь маленько запутался с путями.

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

Ugnich_Andrey

Новичок
2Фанат
это написал сам, и оно работает:
function factorial($n){
if ($n==0) {
$res = 1;
} else {
$res=$n*factorial($n-1);
};
return $res;
}
Может и звучит как парадокс - но КАК это работает я не понимаю. (Имею в виду ветку else {...} ). Хотя в одной статье и написано что "рекурсивное вычисление факториала - задача для первого класса", мне как-то не легче :)
Разбераюсь...

2Гравицапа
http://ru.wikipedia.org/wiki/Спасибо :)
 
Сверху