Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Удаление директории со всем её содержимым. (Ant)
Author Message
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6836
Карма: 131
   поощрить/наказать


PostPosted: Tue Jul 27, 2004 10:19 pm ()
   Post subject: Удаление директории со всем её содержимым.
Reply with quote

Как известно в узких кругах, удаление директории в Perl посредством функции «rmdir» возможно, только если директория пуста. Зачастую необходимо удалить директорию, которая содержит файлы и даже вложенные директории со своими файлами и т.д. Данная функция возвращает размер директории (указывается при вызове в первом аргументе) и полные пути ко всем файлам (даже во вложенных директориях) относительно заданной директории. Если второй аргумент больше «0», то директория со всем её содержимым удаляется.
Code (perl): скопировать код в буфер обмена
# Return size of given directory (including embedded
#
# (the second argument) then delete all content.
sub filesList {
        my $start_dir = $_[ 0 ];
        my ( $number, $size ) = ( 0, 0 );
        my ( @directories, @files, @dir );

        return (www.perldoc.com/perl5.6/pod/func/return.html) if !$start_dir or !-d $start_dir;

        # Collection directories.
        $directories[ 0 ] = $start_dir;
        for ( my $i = 0; $i <= $number; $i++ ) {
                opendir (www.perldoc.com/perl5.6/pod/func/opendir.html)( local (www.perldoc.com/perl5.6/pod/func/local.html) *DIR, $directories[ $i ] );
                        @dir = readdir (www.perldoc.com/perl5.6/pod/func/readdir.html)( DIR );
                closedir (www.perldoc.com/perl5.6/pod/func/closedir.html)( DIR );
                for ( my $k = 0; $k <= $#dir; $k++ ) {
                        if ( $i == 0 ) { local (www.perldoc.com/perl5.6/pod/func/local.html) $/ = '/'; chomp (www.perldoc.com/perl5.6/pod/func/chomp.html) $directories[ 0 ]; }
                        if ( -d "$directories[ $i ]/$dir[ $k ]" and $dir[ $k ] ne '.' and $dir[ $k ] ne '..' ) {
                                $directories[ ++$number ] = "$directories[ $i ]/$dir[ $k ]";
                        }
                }
        }

        # Collection files.
        $directories[ 0 ] = $start_dir;
        @directories = sort (www.perldoc.com/perl5.6/pod/func/sort.html)( @directories );
        for ( my $i = 0; $i <= $number; $i++ ) {
                opendir (www.perldoc.com/perl5.6/pod/func/opendir.html)( local (www.perldoc.com/perl5.6/pod/func/local.html) *DIR, $directories[ $i ] );
                        @dir = readdir (www.perldoc.com/perl5.6/pod/func/readdir.html)( DIR );
                closedir (www.perldoc.com/perl5.6/pod/func/closedir.html)( DIR );
                for ( my $k = 0; $k <= $#dir; $k++ ) {
                        if ( $i == 0 ) { local (www.perldoc.com/perl5.6/pod/func/local.html) $/ = '/'; chomp (www.perldoc.com/perl5.6/pod/func/chomp.html) $directories[ 0 ]; }
                        if ( !-d "$directories[ $i ]/$dir[ $k ]" ) {
                                $size += ( stat (www.perldoc.com/perl5.6/pod/func/stat.html)( "$directories[ $i ]/$dir[ $k ]" ) )[ 7 ];
                                push (www.perldoc.com/perl5.6/pod/func/push.html)( @files, "$directories[ $i ]/$dir[ $k ]" )
                        }
                }
        }

        # Removing all directories.
        if ( $_[ 1 ] ) {
                unlink (www.perldoc.com/perl5.6/pod/func/unlink.html)( @files );
                for ( my $i = $#directories; $i >= 0; $i-- ) { rmdir $directories[ $i ] }
        }

        return (www.perldoc.com/perl5.6/pod/func/return.html) $size, @files;
}
Примеры использования функции:
Code (perl): скопировать код в буфер обмена
#
#
my ( $size, @files ) = filesList( "/home/user/www/data/" );

#
#
my ( $size, @files ) = filesList( "/home/user/www/data/", "1" );

#
filesList( "/home/user/www/data/", "1" );
Back to top
View user's profile Send private message Send e-mail
Xor
Guest





Карма: 386
   поощрить/наказать


PostPosted: Mon Sep 12, 2005 10:33 am (спустя 1 год 1 месяц 15 дней 12 часов 14 минут; написано за 2 минуты 36 секунд)
   Post subject:
Reply with quote

по моему проще, если не пользоваться модулями, так:
Code (perl): скопировать код в буфер обмена
#рекурсивное удаление всех файлов и папок
sub rec_delete {
        my $path = shift (www.perldoc.com/perl5.6/pod/func/shift.html);
                my @all_files = &ReadAllFiles("$path","0");
                foreach (@all_files) {
                        unlink (www.perldoc.com/perl5.6/pod/func/unlink.html)("$path/$_");
                }
                my @all_dirs = &ReadAllFiles("$path","1");
                foreach (@all_dirs) {
                        &rec_delete("$path/$_");
                }
                rmdir (www.perldoc.com/perl5.6/pod/func/rmdir.html)($path);
        return (www.perldoc.com/perl5.6/pod/func/return.html) 1;
}

# получение списка файлов или списка папок; параметры: путь в папку где смотреть, флаг (1 - список директорий, 0 - список файлов)
sub ReadAllFiles {
my ($path,$ff) = @_;
my ($line, @dir_mas, @res_mas,@dira_mas);
  opendir (www.perldoc.com/perl5.6/pod/func/opendir.html)(DIR,"$path");
       @dir_mas=readdir (www.perldoc.com/perl5.6/pod/func/readdir.html)(DIR);
           foreach $line(@dir_mas) {
                   if (!-d "$path/$line" && "$line" ne "." && "$line" ne ".." && !$ff) {
                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@res_mas,$line);
                   }
                   if ( -d "$path/$line" && "$line" ne "." && "$line" ne ".." && $ff) {
                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@dira_mas,$line);
                   }
           }
        closedir (www.perldoc.com/perl5.6/pod/func/closedir.html)(DIR);
  return (www.perldoc.com/perl5.6/pod/func/return.html) @res_mas if (!$ff);
  return (www.perldoc.com/perl5.6/pod/func/return.html) @dira_mas if ($ff);
}
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 409
   поощрить/наказать


PostPosted: Wed Sep 14, 2005 4:30 pm (спустя 2 дня 5 часов 57 минут; написано за 1 секунду)
   Post subject:
Reply with quote

www.hmug.org/man/3/File::Path.php
Back to top
View user's profile Send private message Send e-mail
гость
Guest





Карма: 386
   поощрить/наказать


PostPosted: Fri Feb 29, 2008 11:21 pm (спустя 2 года 5 месяцев 15 дней 6 часов 50 минут; написано за 3 минуты 56 секунд)
   Post subject:
Reply with quote

всётаки интересно почему например так не работает рекурсия
Code (perl): скопировать код в буфер обмена
#!/usr/local/perl/bin/perl -w
print (www.perldoc.com/perl5.6/pod/func/print.html) "Content-Type: text/html\n\n";       

sub ReadAllFiles {
 my $path = shift (www.perldoc.com/perl5.6/pod/func/shift.html);
 local (www.perldoc.com/perl5.6/pod/func/local.html) $line, DIR;
 print (www.perldoc.com/perl5.6/pod/func/print.html) '<hr/><b>' . $path . "/</b><br/>\n";
 
 opendir (www.perldoc.com/perl5.6/pod/func/opendir.html)(DIR, $path) || die (www.perldoc.com/perl5.6/pod/func/die.html) ' ';
 while($line = readdir (www.perldoc.com/perl5.6/pod/func/readdir.html)(DIR)) {
        if (-f $path.'/'.$line) {
                print (www.perldoc.com/perl5.6/pod/func/print.html) $line . "<br/>\n";
        }
        elsif ($line ne '.' && $line ne '..') {
                ReadAllFiles($path.'/'.$line);
        }
 }
 closedir (www.perldoc.com/perl5.6/pod/func/closedir.html)(DIR);
 print (www.perldoc.com/perl5.6/pod/func/print.html) "<hr>\n";
}

 my $dir = '..';
 ReadAllFiles($dir);
доходит до первой дирректории потом до самой вложенной в ней и всё.
как-то можно поправить не создавая массивов содержимого дирректорий ?
(только начинаю изучать perl)
Back to top
09h
Guest





Карма: 386
   поощрить/наказать


PostPosted: Sun Mar 16, 2008 7:06 pm (спустя 15 дней 19 часов 44 минуты; написано за 28 секунд)
   Post subject:
Reply with quote

хоть тема старая но всеравно спс за ф-цию ) не пришлось велосипед изобретать
Back to top
Sova2008
Заглянувший



Joined: 25 Oct 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Sat Oct 25, 2008 12:24 pm (спустя 7 месяцев 8 дней 17 часов 18 минут; написано за 34 секунды)
   Post subject:
Reply with quote

Что заморачиваться? Мне кажется самое простое - File::Path;
rmtree
Back to top
View user's profile Send private message
impactbomb
Заглянувший



Joined: 14 Nov 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Nov 14, 2008 10:38 pm (спустя 20 дней 10 часов 14 минут; написано за 19 секунд)
   Post subject:
Reply with quote

Sova2008

о! спасибо )) совет дельный )
Back to top
View user's profile Send private message
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6836
Карма: 131
   поощрить/наказать


PostPosted: Fri Nov 21, 2008 12:05 pm (спустя 6 дней 13 часов 26 минут; написано за 8 секунд)
   Post subject:
Reply with quote

Sova2008 wrote:
Что заморачиваться? Мне кажется самое простое - File::Path;
Им не всегда получается пользоваться.
Back to top
View user's profile Send private message Send e-mail
xyle
Заглянувший



Joined: 24 Jan 2011
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Mon Jan 24, 2011 10:07 pm (спустя 2 года 2 месяца 3 дня 10 часов 1 минуту; написано за 56 секунд)
   Post subject:
Reply with quote

что-то у меня вообще ни rmtree, ни filesList не работает ..(
rmtree при любых флагах всё удаляет, а filesList ничего не возвращает.
Back to top
View user's profile Send private message Send e-mail
heed
Участник форума



Joined: 03 Jan 2010
Posts: 97
Карма: 8
   поощрить/наказать


PostPosted: Sun Apr 10, 2011 2:54 am (спустя 2 месяца 16 дней 4 часа 47 минут; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

bat-файл
Code (perl): скопировать код в буфер обмена
@rem = '       
        @echo off
        cd        /d %~dp0
        setlocal
        set PATH=%~dp0bin;%PATH%
:: или ещё где путь к perl
        perl %0
        endlocal
        goto ENDOFPERL
rem '
;
#!perl -w
use strict;
$| = 1;
my ($ds , $fs)=(0,0);

sub ReadAllFiles {
 my $path = shift (www.perldoc.com/perl5.6/pod/func/shift.html);
 my $line;
 print (www.perldoc.com/perl5.6/pod/func/print.html) "\n\t\t" . $path . "\n";
 opendir (www.perldoc.com/perl5.6/pod/func/opendir.html)(local (www.perldoc.com/perl5.6/pod/func/local.html) *DIR, $path) || die (www.perldoc.com/perl5.6/pod/func/die.html) 'ошибка открытия';
 while($line = readdir (www.perldoc.com/perl5.6/pod/func/readdir.html)(DIR) ) {
        if (-f $path.'/'.$line) {
         $fs++;
         print (www.perldoc.com/perl5.6/pod/func/print.html) $line . ' ';
        }
        elsif ($line !~ /^\.{1,2}$/) {
         $ds++;
         ReadAllFiles($path.'/'.$line);
        }
 }
 closedir (www.perldoc.com/perl5.6/pod/func/closedir.html)(DIR);
 print (www.perldoc.com/perl5.6/pod/func/print.html) "\n-----------------\n";
}

 my $dir = 'eg';

 ReadAllFiles($dir);
 print (www.perldoc.com/perl5.6/pod/func/print.html) "\n\n$ds-$fs\n\n";
__END__
        :ENDOFPERL
        echo.
        pause
Back to top
View user's profile Send private message
Wooster
Заглянувший



Joined: 13 Apr 2011
Posts: 1
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Wed Apr 13, 2011 5:16 pm (спустя 3 дня 14 часов 22 минуты; написано за 56 секунд)
   Post subject:
Reply with quote

Еще можно удалить в одну строчку через системны вызов
Code (any language): скопировать код в буфер обмена
$result = `rm -fr /path/to/directory/`
Back to top
View user's profile Send private message
tarianz
Заглянувший



Joined: 12 Sep 2011
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Mon Sep 12, 2011 8:20 am (спустя 4 месяца 28 дней 15 часов 4 минуты; написано за 49 секунд)
   Post subject:
Reply with quote

Поскажите плз учебник на перле. Искал переменные my и our где можно по подробнее прочитать?
косоглазие (eyesvision.ru/drugie-bolezni)bates method (eyesvisions.com/)

Last edited by tarianz on Sat Feb 11, 2012 2:01 am; edited 1 time in total
Back to top
View user's profile Send private message
Ohlob
Заглянувший



Joined: 23 Sep 2011
Posts: 2
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 23, 2011 7:04 pm (спустя 11 дней 10 часов 44 минуты; написано за 23 секунды)
   Post subject:
Reply with quote

Quote:
Поскажите плз учебник на перле.
citforum.ru/internet/perl.shtml - склад русскоязычной документации по перлу
Back to top
View user's profile Send private message
viktorz
Заглянувший



Joined: 15 Apr 2012
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Sun Apr 15, 2012 8:08 am (спустя 6 месяцев 21 день 13 часов 3 минуты; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

tarianz wrote:
Поскажите плз учебник на перле. Искал переменные my и our где можно по подробнее прочитать?
косоглазие (eyesvision.ru/drugie-bolezni)bates method (eyesvisions.com/)
Изучал перл по учебнику, называется перл за 15 минут. В инете поискать везде воляется)) А потом все как по масло пошло )
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML