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

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

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #15 : 26 Августа 2004, 16:32:33 »
Phoinix
Цитировать
Phoinix:
Указывай при использовании функции opendir полный путь, и тогда все будет нормально...

спасибо что ткнул... только мне надо не то что бы указать, а передать этот путь в функцию... и что-то не очень получалось...

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Создание дерева каталогов
« Ответ #16 : 26 Августа 2004, 19:02:19 »
y0sh1
Цитировать
только почему... что-то я совсем не втыкаю


Функция readdir возвращает массив в котором первые два элемента являются \'.\' и \'..\'

попробуй набрать в консоли cd .. и и сразу поймешь, почему директория: e:/111/.. является директорией e:/

А эта строка просто, напросто проверяет соответсвие переменной -> .. и при наличии таковой делает следующий цикл...

Вообще проверять Regexp каждый элемент массива - непрактично, проще перед циклом просто напросто два раза повторить readdir:

readdir DIR_LSreaddir DIR_LS;
while (
my $file readdir (DIR_LS) ) {
#next if $file =~ /^\\.\\.?$/;

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Создание дерева каталогов
« Ответ #17 : 26 Августа 2004, 19:19:23 »
Цитировать
Phoinix:
Вообще проверять Regexp каждый элемент массива - непрактично, проще перед циклом просто напросто два раза повторить readdir:

Это что-то новенькое. Зачем??
The documentations is your friend

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #18 : 26 Августа 2004, 19:40:26 »
Вобщем после дня эксперементов наваял я довольно простенький (и наверно всё же кривоватый) скрипт:

use strict;

my $s_root   = \'\';
my $dir_size = 0;
my $file_size = 0;
my $t_dir_size = 0;
my $dir_name = \'\';

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 =~ /^\\.\\.?$/;
next if $root =~ /^\\.\\.?$/;
               if (-d "$root/$file") {
                   dir_ls ("$root/$file");
               } else {
                   $dir_size += (stat("$root/$file"))[7];
               }
        }
#print "$s_root : $dir_size\\n";
}
$dir_name="e:\\\\111";
chdir($dir_name);
opendir(D,$dir_name);
while($s_root=readdir(D)) {
if (-d "$s_root") {
dir_ls ($s_root);
print "$s_root : $dir_size\\n";
$t_dir_size += $dir_size;
}
else {
$file_size += (stat("$s_root"))[7];
}
$dir_size = 0;
}
closedir(D);
print "Files in root directory: $file_size\\n";
$t_dir_size += $file_size;
print "\\nTotal: $t_dir_size\\n";

Он проходит по заданной папке и выводит объём всех подпапок + отдельно объём файлов в корне указаной папки... Теперь решил прикрутить помимо подсчёта объёма всей подпапки ещё и объём файлов в ней по маске - например *.mp3 - по предложеной на форуме кнструкции:
my $size = 0;
$size += (stat($_))[7] for (glob(\'e:/111/*.mp3\'));
print "Size *.mp3 - $size bite";

Соответственно в скрипт написанный выше добавил:


................
               } else {
                   $dir_size += (stat("$root/$file"))[7];
[b]$dir_size_mp3 += (stat("$root/$file"))[7] for (glob("$root/$file/*.mp3"));[/b]
               }
        }
#print "$s_root : $dir_size\\n";
}

...............

[b]print "MP3 in: $dir_size_mp3\\n\\n";[/b]


Но что-то не катит... просто записывает в $dir_size_mp3 какое-то число... !?!?!? В чём может быть дело!?


Phoinix
Цитировать
Phoinix:
Вообще проверять Regexp каждый элемент массива - непрактично, проще перед циклом просто напросто два раза повторить readdir:

 readdir DIR_LS; readdir DIR_LS; while (my $file = readdir (DIR_LS) ) { #next if $file =~ /^..?$/;

проще действительно... у меня не пошло..... может дело в том, что функция рекурсивно вызывется!?

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Создание дерева каталогов
« Ответ #19 : 26 Августа 2004, 20:42:59 »
NeoNox
Цитировать
Это что-то новенькое. Зачем??


Вообщем я чаще readdir закидываю в массив, упераю первых два элемента, а потом провожу обработку...

В принципе, палка о двух концах:

Если количество файдов и директорий довольно большое, то выгружать весь список в массив, бессмысленно, тем более при рекурсии, а проверать каждый элемент... ну не знаю... в любом случае эти два элемента всегда первые и всегда два (если не считать корневую директорию)... так не проще ли просто, напросто после открытия директории, два раза получить эти записи, а потом идти дальше???

Цитировать
у меня не пошло..... может дело в том, что функция рекурсивно вызывется!


Что не пошло???

Цитировать
Но что-то не катит... просто записывает в $dir_size_mp3 какое-то число... !?!?!? В чём может быть дело!?


А ты что картинку ожидал увидеть???

[OFF]Может все-таки книжку почитать?[/OFF]

Оффлайн y0sh1

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Создание дерева каталогов
« Ответ #20 : 27 Августа 2004, 10:20:48 »
Phoinix
Может все-таки книжку почитать?[/quote]
да я знаю, что ламер в перле... читаю конечно... скрипт вроде подправил...

 

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