Автор Тема: Создание дерева каталогов  (Прочитано 10497 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dart Sidius

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 69
  • +0/-0
  • 0
    • Просмотр профиля
    • http://khv.rhk.ru
Создание дерева каталогов
« : 29 Июля 2004, 20:34:35 »
Как енто можно сделать не прибегая ник каким модулям, т.е. ручками. Есть корневой каталог. А из него куча ещё...вот их надо все пройти...

Оффлайн Billi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #1 : 29 Июля 2004, 21:00:50 »
Приблезительно вот так :)

&dir(".","\\t");
sub dir($,$){
 my $DIR;
 my $shift=$_[1];
 my $dirr_=$_[0];
 opendir($DIR,$dirr_);
 print "$shift [$dirr_]\\n";
 foreach(readdir($DIR)){
  if((-d $_)&&($_ ne \'.\')&&($_ ne \'..\')){&dir($_,"$shift\\t");}
  elsif(($_ ne \'.\')&&($_ ne \'..\')){print "$shift $_\\n";}
 }
 closedir(DIR);
}
Но я хотя бы знаю, что ни чего не знаю

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Создание дерева каталогов
« Ответ #2 : 29 Июля 2004, 23:18:43 »
Dart Sidius
perldoc File::Find
Billi
с софтлинками этот код пробовал?
The documentations is your friend

Оффлайн Billi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #3 : 30 Июля 2004, 13:40:43 »
to NeoNox
 софтлинками ?? если не затруднит, что это?
Но я хотя бы знаю, что ни чего не знаю

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Создание дерева каталогов
« Ответ #4 : 30 Июля 2004, 14:02:30 »
man ln
проблема в том, что твой скрипт может "убежать" из текущей папки или зациклиться.
The documentations is your friend

Оффлайн Billi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #5 : 30 Июля 2004, 14:44:41 »
Пробовать не пробовал, но это вполне возможно (при первой же возможноти попробую)
для верности можно поменять условие
if((-d $_)&&(! -l $_)&&($_ ne \'.\')&&($_ ne \'..\')){&dir($_,"$shift\\t");}
точно должно работать
Но я хотя бы знаю, что ни чего не знаю

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #6 : 26 Августа 2004, 11:15:47 »
Помогите ламерку... похожего топа не нашёл решил сюда запостить...
Проблема: надо написать скрипт на перле, который:
- в данной директории показывает список папок в ней (только в ней - во влженных не надо) и их размер (соответственно с подпапками считать);
- показывал бы тоже самое, но только размер файлов (во всей папке с подпапками) считал бы не для всех файлов, а только по заданной маски - например выдать размер всех файлов *.doc каждой подпапки в данной папке.
Сам в перле начинающий... надыбал скрипт на форуме, видоизменил (пока только для 1-го случая) - но что-то не пашет:

Код:
#! perl -w
use strict;
sub dir_ls {
        my $save_dir;
        my $root = shift;
        local *DIR_LS;
 
        opendir DIR_LS ,$root;
 
        while (my $file = readdir (DIR_LS) ) {
               next if $file =~ /^\\.\\.?$/;
               print "$root/$file\\n";
               if (-d "$root/$file") {
                   $count_d++;
                   dir_ls ("$root/$file");
               } else {
                   $dir_size += (stat("$root/$file"))[7];
                   $count_f++;
print "$count_f";
               }
        }
print "\\n\\nTotal -\\nDirs: $count_d\\nFiles: $count_f\\nSize: $dir_size\\n";
}
 
opendir FDIR, ".";
while($nm = readdir FDIR){
next if ($nm eq ".");
next if ($nm eq "..");
 
$stat     = 0;
$count_f  = 0;
$count_d  = 0;
$dir_size = 0;
     dir_ls ($nm);  
}
closedir FDIR;


типа пишет : "Global symbol "$count_d" requires explicit package name" для всех переменных - что не так!? Заранее спасибо, если кто поможет.... ну а если посоветуют ещё и конструкцию  для 2-го варианта (чтобы размер файлов по маске считал0 - то будет вообще счастье! Зараенее спасибо!

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #7 : 26 Августа 2004, 11:36:59 »
y0sh1, Вам надо малость подправить вот этот вот участочек:$stat = 0;
$count_f = 0;
$count_d = 0;
$dir_size = 0;

вот на такой хотя бы:my ($stat,$count_f,$count_d,$dir_size)=(0,0,0,0);
пока-пока. :)

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #8 : 26 Августа 2004, 13:48:23 »
Ну вот исправил...

Код:
use strict;
 
my $s_root   = \'\';
my $dir_size = 0;
my $t_dir_size = 0;
 
sub dir_ls {
        my $save_dir;
        my $root = shift;
        local *DIR_LS;
 
        opendir DIR_LS ,$root;
 
        while (my $file = readdir (DIR_LS) ) {
               next if $file =~ /^\\.\\.?$/;
               print "$root/$file\\n";
               if (-d "$root/$file") {
                   dir_ls ("$root/$file");
               } else {
                   $dir_size += (stat("$root/$file"))[7];
               }
        }
print "$dir_size\\n";
$t_dir_size += $dir_size;
$dir_size = 0;
}
opendir(D,\'e:/111\');
while($s_root=readdir(D))
{
dir_ls ($s_root);
print "\\nSize of $s_root: $t_dir_size\\n";
}
closedir(D);


только он почему то выводит не директорию e:/111 , а корневую!? Где ошибка!?

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #9 : 26 Августа 2004, 14:54:29 »
это Вы вызываете скрипт браузером в "винде"?
тогда Вам надо пользоваться Win32API::File
посудите сами - ну откуда Вашему Apache известно что такое e:/111. :)
Цитировать
Dart Sidius:
Есть корневой каталог. А из него куча ещё...вот их надо все пройти...

Цитировать
y0sh1:
только он почему то выводит не директорию e:/111 , а корневую!?
пока-пока. :)

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #10 : 26 Августа 2004, 15:00:06 »
AnnA
Сорри, я толькотнедавно засел за перл... апапч мне не нужен... он и не установлен даже.... ставил активперл под винду... пытаюсь скриптом сделать работу с директорией вот и всё ... и не получается.. :(

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Создание дерева каталогов
« Ответ #11 : 26 Августа 2004, 15:37:33 »
вот здесь
sub dir_ls {
        my $save_dir;
        my $root = shift;
        local *DIR_LS;
вставь
print "Я здесь: $root\\n";
и увидишь где твой скрипт на данный момент.
The documentations is your friend

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Создание дерева каталогов
« Ответ #12 : 26 Августа 2004, 15:46:24 »
AnnA
Цитировать
посудите сами - ну откуда Вашему Apache известно что такое e:/111


Собственно Perl никогда у Apache не спрашивает, зает ли он такую директорию или нет... :)

При работе Perl скрипта Apache получает только результат работы...

y0sh1

sub dir_ls {
        
my $save_dir;
        
my $root shift;
        
local *DIR_LS;
 
        
opendir DIR_LS ,$root#!!!!!


$root в твоем скрипте - название папки которая находится в e:/111, но никак не путь к этой папке, естественно, что opendir будет открывать не ту директорию которую надо, а пытаться открыть директорию $root находящуюся в корне (как правило диск на котором установлен Perl)...

Указывай при использовании функции opendir полный путь, и тогда все будет нормально... ;)

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #13 : 26 Августа 2004, 16:04:48 »
NeoNox
Цитировать
вставь print "Я здесь: $root\\n"; и увидишь где твой скрипт на данный момент.

вставил... всё равно не понятно, почему проход начинается с корневой директории (из которой запускается скрипт), а не из папки "E:/111"!?
Те почему то не получается передать в рекурсив функцию путь... она идёт из корня... :(
Вот тут посоветовали применить конструкцию вида:
Цитировать
$dir_name="e:\\\\111";
chdir($dir_name);
opendir(D,$dir_name);

!?!? :(

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #14 : 26 Августа 2004, 16:30:23 »
Во... нашёл.. точнее мне показали...
Цитировать
       while (my $file = readdir (DIR_LS) ) {
               next if $file =~ /^\\.\\.?$/;
              next if $root =~ /^\\.\\.?$/;
               print "file: $root/$file\\n";
               if (-d "$root/$file")
               {
                   dir_ls ("$root/$file");

Вот с этой строчкой (выделенной) всё вроде заработало... только почему... что-то я совсем не втыкаю... :(

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28