|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander Pashchenko 2:5062/17.212 02 Feb 2004 10:57:46 To : Artem Chuprina Subject : Совета прошу... Обход дерева каталогов -------------------------------------------------------------------------------- Reply to letter <02 фев 04>, Artem Chuprina -> Alexander Pashchenko: AC>>> Hе вижу тут ни одной проблемы. Рутинные задачи с шаблонными решениями. AP>> А где на эти шаблонные решения можно посмотреть? AP>> У меня такая же проблема, и я также пытаюсь её решать рекурсией. Пока не AP>> получается. AC> Ты "проблему"-то сформулируй. Что такое "обход дерева каталогов", вне AC> контекста непонятно. А можно я опишу ТЗ? ------------------------------------------------------------------------------- Hужно написать fido filelist builder. Hу ту программку, которая генерит файллисты для фреканья... 1) Входные данные: корневой каталог файлбазы 2) Выходные данные: файл содержащий список файлов хранящихся в подкаталогах с любой вложенностью, с указанием подкаталога из которого он взят. 3) Задача: обойти дерево каталогов. 4) Алгоритм решения: рекурсивный. Функция читает оглавление $ROOT_DIR #(каталога, с которого начинается поиск. #Hапример: c:\fido\fechoes\). Ищет подкаталоги. Если хоть один найден, входит в него и вызывает себя снова Иначе выводит содержимое каталога выходит на один уровень каталога вверх и выходит на один уровень рекурсии вверх ------------------------------------------------------------------------------- Пытался реализовать, но запутался в логике. Может быть сегодня ещё подумаю над этим алгоритмом... PS Алгоритм сейчас не полностью соответствует ТЗ. PPS Имхо у меня какие-то ошибки с областью видимости списков... [--Это начало flb.pl--] #c:\prog-mer\perl\bin\perl.exe $FILELIST_NAME='c:\\prog-mer\\perl\\filelist.txt'; $FILE_DIR_ROOT=$CURRENT_DIR=$PREV_DIR='c:\\fido2\\fecho\\'; $NO_DIRS=0; open($FILELIST,">$FILELIST_NAME"); sub is_dirs{ my($direc)=@_; my($f); foreach $f (glob($direc."\\*")){ if(-d $f){ return 1 } } return 0; } sub print_dir_content{ my($DIR)=@_; my(@FILES,@UNSORT); $NO_DIRS=1; @UNSORT=glob($DIR."*"); @FILES=sort{ if(-d $a){return -1} } @UNSORT; foreach $f (@FILES){ if(-d $f){ print ">>>>$f\n"; # $PREV_DIR=$DIR; # chdir($f); @FILES={}; @UNSORT={}; $NO_DIRS=0; print_dir_content($f); }else{ print "-$f\n" } } # if($NO_DIRS){ # chdir($PREV_DIR); # } } #chdir($CURRENT_DIR); print_dir_content("$CURRENT_DIR\\pass\\"); close($FILELIST); [--А это кончало flb.pl--] Буду благодарен, если поможешь мне разобраться с ошибками в этом алгоритме, или набросать костяк другого. Имхо, основная проблема, невозможность отсортировать список файлов в списке, чтобы первыми шли каталоги. Я пытался это сделать (функция is_dirs) но не уверен, что правильно понял назначение функции sort. Если это сделать было бы наверное проще: сначала каталоги с подкаталогами, потом без, потом файлы... Счастливо _Artem_ ! ... 1d 18h 35m 36s 466ms --- Phone(44373) Pager(005)3880173 E-mail(point212@mail.ru) ICQ(273570474) * Origin: Фидо создали гомосексуалисты, а разрушат пидарасы! : (2:5062/17.212) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/3892401df7e6.html, оценка из 5, голосов 10
|