Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

help with unraring

by Anonymous Monk
on Apr 23, 2012 at 10:54 UTC ( #966575=perlquestion: print w/replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks

I want to unrar an archive by extracting the archived files one by one so as to perform some searching on each file.

The two main modles for this are the Archive::Rar and Archive::Unrar. Archive::Rar has the dependecy that the WinRAR software should be already present on the system to extract so it is not free so not usable. Archive::Unrar has prerequisite that unRAR.dll be present which is a more workable solution as i cannot buy WinRAR software.

Now my problem is with the Archive::Unrar module in which i am trying the following code

use Archive::Unrar qw(list_files_in_archive %donotprocess process_file +); @files =list_files_in_archive( file=>"C:/perl2exe/For perl 5.10.1/tes +t.rar" ,undef); foreach my $file (@files) { if ($file =~ /\.txt\z/) { $result = process_file( file=>'C:/perl2exe/For perl 5.10.1/test.ra +r', password=>undef, output_dir_path=>"C:/extract/", #selection=>ERAR_MAP_DIR_YES, #callback=>$callback ); } }

IN the above code i dont get the desired archive extract to the output directory. I checked with return types of subroutines list_files_in_archive and process_files both return error_codes . So how can i possibly achieve what i am trying to do

Replies are listed 'Best First'.
Re: help with unraring
by roboticus (Chancellor) on Apr 23, 2012 at 11:05 UTC

    I'd suggest looking up the error codes to see what they mean, and then correcting the error. Grepping through the source code, searching the internet via google are typical way to look up the errors. Since you don't mention what the error codes are, though, I couldn't tell you what's wrong.


    When your only tool is a hammer, all problems look like your thumb.

Re: help with unraring
by nikosv (Chaplain) on Apr 24, 2012 at 07:41 UTC

    list_files_in_archive does not return references to the contained files but just dumps them to stdout. If you need to get the filenames then you must capture the stdout and process it. Instead of forking, use the IO::CaptureOutput module

    use Archive::Unrar qw(list_files_in_archive process_file); use IO::CaptureOutput qw(capture); my @files; { local ($stdout, $stderr); capture sub {list_files_in_archive( file=>"C:/perl2exe/For perl 5.10. +1/test.rar" ,undef)}, \$stdout, \$stderr; @files=map {/Archive contents : (.*\.txt$)/ } split ("\n",$stdout); } foreach (@files) { print "file ",++$i," : ",$_,"\n"; }

    Also check the $result value to get and indication of the error returned

      thanks for the reply. $result gives error -->found in chain.already processed. What does that mean ? How can i remove it?

        is that a multipart file you are trying to extract? you can safely ignore this message;it merely says that the file has been already processed.It is used for caching purposes
Re: help with unraring
by Argel (Prior) on Apr 23, 2012 at 21:06 UTC
    Is there some reason you cannot just shell out to e.g. run 7-Zip (specifically, 7z.exe), which can decompress RAR files?

    Elda Taluta; Sarks Sark; Ark Arks
    My deviantART gallery

      I want to do it programatically because i need it in a large script

        That's not a relevant response to Argel's suggestion; or, it's not relevant based on anything you've told us about your requirements.

        Sure, you'll find many nodes here with which urge use of Perl's own capabilities or modules to achieve a goal, but that's NOT the same as deprecating use of an outside capability... nor somehow is it somehow 'non-"programatically".'

        edit: s/with/which/

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://966575]
Approved by Corion
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2018-08-15 14:31 GMT
Find Nodes?
    Voting Booth?
    Asked to put a square peg in a round hole, I would:

    Results (161 votes). Check out past polls.