Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

рекурсивное чтение каталога

9.0K
02 июня 2007 года
elvenoracle
56 / / 16.04.2007
есть код:
 
Код:
#!/usr/bin/perl
$dir = "/home/";
opendir(DIR, "$dir") or die;
@files = readdir DIR;
print "@files";
closedir (DIR);


как сделать рекурсивное чтение содержимого?
347
02 июня 2007 года
Maniak
319 / / 05.11.2005
это типа найти все файлы и папки и файлы во вложеных папках?
если так то вот код на php:
Код:
function print_dir($d){
if($dir=opendir($d)){
    while($file=readdir($dir)){
        if(is_file("$d/$file")){
            echo "       Файл: ".$file."<br>";
        }elseif(is_dir("$d/$file") && $file!='.' && $file!='..'){
            echo "  <font color='red'>Директория: </font>".$file."<br>";
            print_dir("$d/$file");
        }
    }
}
}
29K
02 июня 2007 года
Dinamit
6 / / 02.06.2007
Мой вариант:
Код:
# Возвращает листинг папки и всех вложенных подпапок
function dirlist($dir, $delete_pdirs = FALSE){
  if(is_dir($dir) and is_readable($dir)){
    $dir_contents = scandir($dir);
    if($delete_pdirs){
      unset($dir_contents[array_search(".", $dir_contents)], $dir_contents[array_search("..", $dir_contents)]);
    }
    foreach($dir_contents as $element){
      if($element != "." and $element != ".."){
        if(is_dir($dir. "/" . $element)){
          $dir_contents[$element] = dirlist($dir. "/" . $element, $delete_pdirs ? TRUE : FALSE);
        }
      }
    }
    return $dir_contents;
  }
  else{
    return FALSE;
  }
}

array dirlist(string dir, [boolean delete_pdirs]);
dir - адрес директории для чтения (без конечного слеша, удалялку написать - раз плюнуть, но зачем грузить функцию?)
delete_pdirs - если установлен в TRUE, удалятся псевдодиректории "." (текущая папка) и ".." (родительская папка)
9.0K
03 июня 2007 года
elvenoracle
56 / / 16.04.2007
чёт я всё-равно не пойму как это сделать на perl
сейчас имею :
 
Код:
#!/usr/bin/perl -w
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);

может использовать foreach?
15
04 июня 2007 года
shaelf
2.7K / / 04.05.2005
Ты сам в теме назвал слово рекурсия, а где она у тебя тут?
92
04 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: elvenoracle
чёт я всё-равно не пойму как это сделать на perl
сейчас имею :
 
Код:
#!/usr/bin/perl -w
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);

может использовать foreach?


а может использовать функцию? и лучше рекурсивную.... как думаешь? ;)

9.0K
04 июня 2007 года
elvenoracle
56 / / 16.04.2007
Цитата: shaelf
Ты сам в теме назвал слово рекурсия, а где она у тебя тут?



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

15
05 июня 2007 года
shaelf
2.7K / / 04.05.2005
Нужно определить функцию для чтения каталога и вызывать нутри неё саму себя. Примеры смотри выше. Если порыть на php.net, то найдёшь готовые варианты.
92
05 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
выше есть пример Dinamit'а

Код:
# Возвращает листинг папки и всех вложенных подпапок
function dirlist($dir){
  if(is_dir($dir) and is_readable($dir)){
    $dir_contents = scandir($dir);
    foreach($dir_contents as $element){ // вот твой foreach
      if($element != "." and $element != ".."){
        if(is_dir($dir. "/" . $element)){  // если директория, то ф-я вызывает сама себя для этой директории (рекурсия)
          $dir_contents[$element] = dirlist($dir. "/" . $element);
        }
      }
    }
    return $dir_contents;
  }
  else{
    return FALSE;
  }
}
353
09 июня 2007 года
Nixus
840 / / 04.01.2007
На Perl:

Код:
sub findFiles
{
    local $basePath = $_[0];
    local @files = ();

    recursiveSearch('');

    return [sort @files];
}

sub recursiveSearch
{
    my($path) = @_;
    my $f;

    $path .= '/'
        if $path ne '';

    my $fullPath = $basePath.$path;

    return 0
        if !opendir(local* DIR, $fullPath);

    while($f = readdir(DIR))
    {
        next
            if $f =~ /^\.+$/;

        my $fullName = $fullPath.$f;

        if(-d $fullName)
        {
            recursiveSearch($path.$f);
        }
        elsif(-f $fullName)
        {
            push(@files, $path.$f);
        }
    }

    closedir(DIR);
}

$files = findFiles("путь");
foreach (@$files) {
    print $_, "\n";
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог