Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > у кого есть опыт работы с архивами?


Автор: igorold 28.4.2006, 09:32
Имеется куча архивов типа
Код

kn-04.03.06_21.00.tgz
kn-05.03.06_21.00.tgz
kn-06.03.06_21.00.tgz
kn-07.03.06_21.00.tgz
kn-08.03.06_21.00.tgz

из каждого надо открывать для обработки файл report
т.е. надо выбрать архив, разархивировать его на сервере, обработать файл report
и стереть разархивированные файлы (там есть подкаталоги)

Подскажите, пожалуйста как это реализуется ... 
поиском именно такой задачи не нашел ... не посылайте на поиск ....  

Автор: nitr 28.4.2006, 10:00
smile тебе снова пример? smile примеры в комплекте к модулям
вот http://search.cpan.org/CPAN/authors/id/K/KA/KANE/Archive-Extract-0.08.tar.gz качай

а примеры http://search.cpan.org/~kane/Archive-Extract-0.08/lib/Archive/Extract.pm

Добавлено @ 10:01 
всегда http://search.cpan.org/search?query=tar&mode=all ищи smile примеры всегда в комплекте ;)
 

Автор: GoodBoy 28.4.2006, 10:12
igorold, как вариант, если работаешь под *nixами, используй системные вызовы в обратных кавычках ``
т.е.:
Код
`unzip файл в нужный каталог`;
сделать что нужно с файлом report в это каталоге;
`rm дерево каталогов`;
 

Автор: nitr 28.4.2006, 10:24
Вот http://search.cpan.org/~softdia/Archive-TarGzip-0.03/lib/Archive/TarGzip.pm примеры.. их много на СПАНЕ smile 

Автор: igorold 28.4.2006, 13:13
похоже пакет криво встал - выдается ошибка, когда я его подключаю по:
Код

use Archive::Extract;

Код

Can't locate IPC/Cmd.pm in @INC (@INC contains: /var/www/ComplexDB /usr/lib/perl5/5.8.5/i386-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl .) at /usr/lib/perl5/site_perl/5.8.5/Archive/Extract.pm line 7.
BEGIN failed--compilation aborted at /usr/lib/perl5/site_perl/5.8.5/Archive/Extract.pm line 7.
Compilation failed in require at /var/www/ComplexDB/ComplexDB.pm line 9.
BEGIN failed--compilation aborted at /var/www/ComplexDB/ComplexDB.pm line 9.
Compilation failed in require at /var/www/ComplexDB/index.pl line 7.
BEGIN failed--compilation aborted at /var/www/ComplexDB/index.pl line 7.
 

Автор: nitr 28.4.2006, 15:49
указано, что надо установить IPC::Cmd 

Автор: igorold 2.5.2006, 06:41
Ну да, при установке такое сообщение было:
Код

perl Makefile.PL
Warning: prerequisite IPC::Cmd 0.24 not found.
Warning: prerequisite Locale::Maketext::Simple 0 not found.
Warning: prerequisite Module::Load::Conditional 0.04 not found.
Warning: prerequisite Params::Check 0.07 not found.
Writing Makefile for Archive::Extract

а где взять эти пакеты?
 

Автор: nitr 2.5.2006, 11:33
http://search.cpan.org 

Автор: igorold 2.5.2006, 12:37
nitr , спасибо ... вот пришлось установить такие пакеты:
Код

IPC-Cmd-0.24.tar.gz
IPC-Run-0.79.tar.gz
Locale-Maketext-Simple-0.14.tar.gz
Module-Load-0.10.tar.gz
Module-Load-Conditional-0.08.tar.gz
Params-Check-0.24.tar.gz
Archive-Extract-0.08.tar.gz

.... процесс идет, теперь очередная ошибка при выполнении :
Код

use Archive::Extract;
.................................................
my $ae = Archive::Extract->new( archive => $UpArhiv );
my $ok = $ae->extract( to => '/var/www/ComplexDB/unzipped' ) or die $ae->error;

вот эта die и выдает ошибку:
Код

Произошла ошибка!!! Error Extract failed, no extractor found at /usr/lib/perl5/vendor_perl/5.8.4/CGI/Carp.pm line 314.
   

Автор: igorold 2.5.2006, 13:36
может этим никто не занимался и ни у кого нет работающего примера?????

самостоятельно изучать это, конечно хорошо .... но сейчас мне необходим образец ....

подайте, кто может .... на cpan нет конкретного примера .... только в общем .... что-то до меня не доходит .... 
поэтому жду пример ... поскребите по сусекам ... пожалуйста ...  smile  smile  smile  

Автор: sharq 2.5.2006, 16:21
igorold, используй модуль Archive::Tar. Очень легко и просто!

 smile  

Автор: igorold 3.5.2006, 06:13
Так ведь если есть модуль Archive::Extract, должен же он работать .... 
может найдется опытный человек, который с ним работал ...
у меня пока есть что делать, как приспичит, может на другой модуль посмотрю ...  

Автор: nitr 3.5.2006, 11:07
igorold, для установки модуля введи:
>perl -MCPAN -e 'install Archive::Extract'
на все вопросы можно ответить yes smile , т.к. он будет спрашивать про загрузку не достающих модулей (обычно так)

Самый лучший модуль http://search.cpan.org/CPAN/authors/id/K/KA/KANE/Archive-Tar-0.23.tgz

вот пример:
Код
#!/usr/bin/perl
use Archive::Tar;

my $tar = Archive::Tar->new;

$tar->read('Archive-TarGzip-0.03.tar.gz', 1);
$tar->extract();
 

Автор: igorold 3.5.2006, 12:54
опять ошибка:
Код

Произошла ошибка!!! Error Can't use an undefined value as an ARRAY reference at /usr/lib/perl5/site_perl/5.8.5/Archive/Tar/Std.pm line 736.

Код

use Archive::Tar;
....................................
            my $tar = Archive::Tar->new;
            $tar->read($UpArhiv, 1);
            $tar->extract('dbreport');
            my $fl = $tar->list_files();
 

Автор: nitr 3.5.2006, 13:11
я не могу съэмулировать твою ошибку smile

твой код рабочий, проверил на 3 компах. Даже если неопределена $UpArhiv, то он выдаёт другую ошибку:
Could not create filehandle for '': No such file or directory! at D:\1.pl line 0
No files found for  at D:\1.pl line 11


Можешь прикрепить сюда один из файликов в переменной $UpArhiv
 

Автор: igorold 3.5.2006, 13:24
Такие сообщения у меня были при установке ... может что-то криво встало?
Код

perl Makefile.PL

Writing Makefile for Archive::Tar

make

cp bin/ptar blib/script/ptar
/usr/bin/perl5.8.5 "-MExtUtils::MY" -e "MY->fixin(shift)" blib/script/ptar
Manifying blib/man3/Archive::Tar::Win32.3pm
Manifying blib/man3/Archive::Tar.3pm

make test

PERL_DL_NONLAZY=1 /usr/bin/perl5.8.5 "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/01_Tar....Compression not available at /var/tmp/Archive-Tar-0.23/blib/lib/Archive/Tar.pm line 13
t/01_Tar....ok
        1/12 skipped: Can not do compression checks, 1/12 unexpectedly succeeded
All tests successful (1 subtest UNEXPECTEDLY SUCCEEDED), 1 subtest skipped.
Files=1, Tests=12,  0 wallclock secs ( 0.14 cusr +  0.01 csys =  0.15 CPU)

make install

Writing /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Archive/Tar/.packlist
Appending installation info to /usr/lib/perl5/5.8.5/i386-linux-thread-multi/perllocal.pod


Добавлено @ 13:36 
а как прикрепить файлик, не могу найти ...  

Автор: nitr 3.5.2006, 13:58
Ой... я и сам не  заметил, что не прикрепить smile Выложи где-нить и дай ссылку.
качать http://search.cpan.org/CPAN/authors/id/K/KA/KANE/Archive-Tar-1.29.tar.gz
я пока не понял, как тебе дал на версию 0.23 

Привожу логи... не обращай внимания, что  винда... скачай модуль по той ссылке и должно всё работать ;)
Код
D:\Archive-Tar-1.29>Makefile.PL

Archive::Tar comes with a utility called 'ptardiff' which lets you run diffs aga
inst tar archives.

However, this utility requires you to have Text::Diff installed.

To add Text::Diff as a prerequisite, please supply the '-d' option when invoking
 this Makefile.PL.

Checking if your kit is complete...
Looks good
Writing Makefile for Archive::Tar


Код
D:\Archive-Tar-1.29>nmake test

Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

cp lib/Archive/Tar/Constant.pm blib\lib\Archive\Tar\Constant.pm
cp lib/Archive/Tar.pm blib\lib\Archive\Tar.pm
cp lib/Archive/Tar/File.pm blib\lib\Archive\Tar\File.pm
        E:\Archive\Perl\bin\perl.exe -MExtUtils::Command -e cp bin/ptardiff blib
\script\ptardiff
        pl2bat.bat blib\script\ptardiff
        E:\Archive\Perl\bin\perl.exe -MExtUtils::Command -e cp bin/ptar blib\scr
ipt\ptar
        pl2bat.bat blib\script\ptar
        E:\Archive\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harnes
s(0, 'blib\lib', 'blib\arch')" t\00_setup.t t\01_use.t t\02_methods.t t\03_file.
t t\04_resolved_issues.t t\99_clean.t t\99_pod.t
t\00_setup..............ok
t\01_use................ok
t\02_methods............# No long filename support - long filename extraction di
sabled
t\02_methods............ok
t\03_file...............ok
        11/178 skipped: Attributes defined, may not be plainfile
t\04_resolved_issues....ok
t\99_clean..............ok
t\99_pod................skipped
        all skipped: Test::Pod v0.95 required for testing POD
All tests successful, 1 test and 11 subtests skipped.
Files=7, Tests=729,  4 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 CPU)
 

Автор: igorold 3.5.2006, 14:23
ОК, переустановил новую версию .... 
Код

            my $tar = Archive::Tar->new;
            $tar->read("$UpArhiv", 1);
            $tar->extract('dbreport','/unzipped');
            my $fl = $tar->list_files();

            my %FormData = ( ErrorText => "Смотрим результат ($UpArhiv) : $fl" );
            return $self->tt_process('importerror.tmpl', \%FormData);

и печатается строка: 
Код

Смотрим результат (kazan-31.03.06_21.00.tgz) : 0

т.е. переменная $fl == 0 ????
не пойму - ошибок не выдается, результата не вижу ... , в каталоге /unzipped ничего не появляется .... 

а можно расширить пример, как  дальше с этим файлом проработать? 

Автор: nitr 3.5.2006, 16:37
$tar->list_files(); - это массив smile

Код
...
my @fl = $tar->list_files();
print "Files in archive:\n";
foreach my $file (@fl) {
  print "\t$file\n";
}


а твой 0 это скалярная величина массива smile , грубо говоря длина smile т.е. в нём ничего нет smile

Добавлено @ 16:39 
значит, что Архив пустой. 

Автор: igorold 4.5.2006, 07:10
в архиве содержаться следующие файлы:
Код

/linux-log                                        │      0│Мар 30 09:30│
/pilot                                            │      0│Мар 30 09:30│
 dbreport                                         │    357│Май  3 16:31│
 fm-errors                                        │   3401│Мар 30 09:29│
 fm-reports                                       │    226│Май  3 16:29│
 pap_err                                          │     88│Май  3 16:29│
 sys-stat

немного переделал:
Код

            my $tar = Archive::Tar->new;
            $tar->read("$UpArhiv", 1);
            $tar->extract();
            my @fl = $tar->list_files();
            my %FormData = ( ErrorText => "Смотрим результат ($UpArhiv) : $fl[0]" );

получаем на экране:
Код

Смотрим результат (k-30.03.06_07.00.tgz) :

т.е. $fl[0] - пустое имя файла .... 
имя архива я получаю:
Код

    my $UpFile  = $self->query()->upload('importfile');
    my $UpArhiv = $self->query()->upload('importarc');

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

подскажите, что не так ... кто-то же работал с архивом .... 
поэтому мне проще переработать РАБОТАЮЩИЙ пример ... но когда сам находишь ляпу, опыта, конечно больше ... 
но я хотел бы использовать ВАШ опыт ....  

Автор: nitr 4.5.2006, 09:37
igorold, просьба выложить где-нить один файлик архив, дай ссылку, я дам пример работающий с твоим архивом. Такое чувство что он не тар. Все твои действия верны. Так как у тебя таг+гзип, то может сначала установить модуль http://search.cpan.org/CPAN/authors/id/T/TO/TOMHUGHES/IO-Zlib-1.04.tar.gz

Добавлено @ 09:38 
так сказано  мане ;)
Цитата

Archive::Tar provides an object oriented mechanism for handling tar files. It provides class methods for quick and easy files handling while also allowing for the creation of tar file objects for custom manipulation. If you have the IO::Zlib module installed, Archive::Tar will also support compressed or gzipped tar files.

An object of class Archive::Tar represents a .tar(.gz) archive full of files and things.
 

Автор: igorold 4.5.2006, 11:33
IO-Zlib-1.04  я установил, при установке я установил 
Код

Compress-Zlib-1.41
IO-Zlib-1.04
Text-Diff-0.35

может тебе на мыло сбросить? .... я пока не знаю, где бы ссылку сделать ...  

Автор: nitr 4.5.2006, 16:02
1.pl
Код
#!perl
use Archive::Tar;

my $tarf = 'k-30.03.06_07.00.tgz';
my $tar = Archive::Tar->new();
$tar->read($tarf, 1);
my @fl = $tar->list_files();
foreach my $file (@fl) {
  print "\t", $file,"\n";
}


Цитата
D:\>1.pl
        dbreport
        fm-errors
        fm-reports
        linux-log/
        linux-log/syslog
        linux-log/messages
        linux-log/kernel_err
        linux-log/daemons_err
        linux-log/apcupsd
        pap_err
        pilot/
        pilot/pilot.log
        sys-stat
 

Автор: igorold 5.5.2006, 06:47
Попробовал все это в отдельном файле - работает!!!!
А в моем скрипте нет!!!  smile 

Значит так, структура скрипта такая: есть 2 файла:
index.pl
Код

#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use lib "/var/www/ComplexDB";
use ComplexDB;
my $app = ComplexDB->new();
$app->run();

ComplexDB.pm 
Код

package ComplexDB;

use base 'CGI::Application';
use CGI::Application::Plugin::TT;
use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);
use strict;
use Digest::SHA1 qw (sha1_base64);
use Date::Manip;
use Archive::Tar;
....................................................
my $Comm = "Смотрим результат ($UpArhiv) :";
my $tarf = 'k-30.03.06_07.00.tgz';
my $tar = Archive::Tar->new();
$tar->read($tarf, 1);
my @fl = $tar->list_files();
foreach my $file (@fl) {
 # print "\t", $file,"\n";
  $Comm .= "\t", $file,"\n";
}
            my %FormData = ( ErrorText => " $Comm" );
            return $self->tt_process('importerror.tmpl', \%FormData);

и не печатается ни одного имени файла ..... может что-то из USE дает такую проблему ....  smile   

Автор: igorold 5.5.2006, 07:29
Кажется работает, надо было в переменную так писать:
Код

$Comm .= "\t". $file."\n";
 

Автор: igorold 5.5.2006, 08:00
Еще я вычислил, что если архив не находится в каталоге скрипта, то он не разархивируется (линукс, мозилла)
из-за этого видимо я не мог ничего добиться. может из-за того, что я передаю имя файла как :
Код

my $tarf = "$UpArhiv";

но если я передаю так:
Код

my $tarf = $UpArhiv;

то выдается ошибка:
Код

Error Undefined subroutine Fh::read at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Archive/Tar.pm line 251

где $UpArhiv - я выбираю так:
Код

<input type="file" name="importarc">

в скрипте:
Код

my $UpArhiv = $self->query()->upload('importarc');
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)