Рекурсивный спуск

Аяяйка

Новичок
Рекурсивный спуск

Здравствуйте,

Ниже представлен скрипт, "Рекурсивная функция удаления каталога с произвольной степенью вложенности".
Как я понял скрипт должен удалять все что находиться в папке TEMP (папки, подкаталоги, файлы)?

Допустим, у нас есть следующая иерархия:

temp/
каталог1/
..........кат11/
...............кат111/
...............файл111
..........кат12/
...............файл121
каталог2
файл3

Так вот это алгоритм, насколько я понимаю алгоритм пройдет следующий путь -> ТЕМП/каталог1/кат11/кат111/
а в остальные даже не заглянет... Правильно?


Код может содержать неточности, так как скопирован из акробата
PHP:
// Рекурсивная функция удаления каталога
/ / с произвольной степенью вложенности
function full_del_dir($directory)
{
$dir = opendir($directory);
while(($file - readdir($dir)))

// Если функция readdir() вернула файл, удаляем его
if(is_file("$directory/$file")) unlink("$directory/$file");
// Если функция readdir() вернула каталог и он
//не равен текущему или родительскому, осуществляем
// рекурсивный вызов full_del_dir() для этого каталога
else if (is_dir("$directory/$file") &&
$file != "." &&
$file != "..")
{
full_del_dir("$directory/$file") ;
closedir($dir); // А эти строчки вообще доходят до исполнения после оператора full_del_dir("$directory/$file") ; !!!!!????
rmdir($directory); 
echo("Каталог успешно удален");
}
full__del_dir ("temp") ;
 

Вурдалак

Продвинутый новичок
Re: Рекурсивный спуск

Автор оригинала: Аяяйка
ТЕМП/
каталог1/
..........кат11/
...............кат111/
...............файл111
..........кат12/
...............файл121
каталог2
файл3

Так вот это алгоритм, насколько я понимаю алгоритм пройдет следующий путь -> ТЕМП/каталог1/кат11/кат111/
а в остальные даже не заглянет... Правильно?
— у тебя, судя по этой «иерархии», каталоги «ТЕМП» и «каталог1» на одном уровне. Ты можешь хотя бы «иерархию» нормально написать?

-~{}~ 11.02.10 01:29:

И можно аккуратнее с именами? То «TEMP», то «ТЕМП», то «temp»
 

Аяяйка

Новичок
Обычная файловая система, в обычном каталоге )) попробую


temp/
...каталог01/
................кат011/
....................кат0111/
....................файл0111
................кат012/
...................файл0121
...каталог02
.. файл03

Здесь больше сам алгоритм непонятен, принцип
 

Вурдалак

Продвинутый новичок
Ну а ты можешь привести код в рабочий вид, поставить в начале тела функции
PHP:
echo $directory, '<br />';
и убедиться какие каталоги открываются?
 

Аяяйка

Новичок
ну принципе я просто теоретически сомневаюсь что он заработает, с рекурсивками нет опыта, если предположить, что все каталоги открываются, то он заработает или нет? вот в чем вопрос и если да, то почему

Мое мнение, что он отработает только одну ветвь каталога.... вот и в уме не получается трассировать
 

Вурдалак

Продвинутый новичок
Автор оригинала: Аяяйка
ну принципе я просто теоретически сомневаюсь что он заработает ...
... в уме не получается трассировать
что тебе мешает проверить код на практике?

-~{}~ 11.02.10 01:40:

Заменив, разве что, unlink() на echo

-~{}~ 11.02.10 01:42:

Ну и убрав rmdir() :)
 

Аяяйка

Новичок
он работает и обходит все ветви) осталось понять теперь как)

вот например такой пример)

Каталог (./temp/кат11/кат111/кат1111) успешно удален
Каталог (./temp/кат11/кат111) успешно удален

непонятно как он выбирается на уровень выше



PHP:
// Рекурсивная функция удаления каталога
// с произвольной степенью вложенности
function full_del_dir($directory)
{
	$dir = opendir($directory);
	while(($file = readdir($dir)))
	{
		// Если функция readdir() вернула файл, удаляем его
		if(is_file("$directory/$file")) echo "спуск = $directory/$file"."<br>";//unlink("$directory/$file");
		//echo $file;
		// Если функция readdir() вернула каталог и он
		//не равен текущему или родительскому, осуществляем
		// рекурсивный вызов full_del_dir() для этого каталога
		else if (is_dir("$directory/$file") &&
		$file != "." &&
		$file != "..")
		{
			full_del_dir("$directory/$file") ;
		}
	}
	closedir($dir); 
	//rmdir($directory); 
	echo("Каталог ($directory) успешно удален<br>");
}
full_del_dir("./temp") ;
 

Аяяйка

Новичок
)))) алгоритм)))

Каталог (./temp/кат11/кат111/кат1111) успешно удален
Каталог (./temp/кат11/кат111) успешно удален
Каталог (./temp/кат11/кат112) успешно удален
Каталог (./temp/кат11) успешно удален
Каталог (./temp/кат12) успешно удален

то есть сначала он ))) (оценил я шутку) забирается в самую глубину, пом вылезает обратно

как я понимаю его работу:
находит каталог кат11 спускается,
.....
находит каталог кат1111, он пуст, удаляет..

далее закрывается директория кат1111 и все, (цикл while закончен, директория закрыта)
почему он возвращается вверх на уровень выше?
 

baev

‹°°¬•
Команда форума
Вопрос «кто?» в Вашем случае совсем не шуточный.

Когда поймёте, что на самом деле «он» — не один, всё сразу станет на свои места.
(Тот «он», что на верхнем уровне, вниз вообще не опускается.)
 

fixxxer

К.О.
Партнер клуба
[m]RecursiveDirectoryIterator[/m], мм?

Хотя научиться ручками реализовывать рекурсивный обход, да, надо
 
Сверху