Стартовый пул
This commit is contained in:
		
							
								
								
									
										3
									
								
								unrar/Examples/Perl/readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								unrar/Examples/Perl/readme.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
For an open source application written in Perl which uses unrar.dll, visit:
 | 
			
		||||
    http://unrarextractrec.sourceforge.net/
 | 
			
		||||
    http://sourceforge.net/projects/unrarextractrec/
 | 
			
		||||
							
								
								
									
										173
									
								
								unrar/Examples/Perl/unrar.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								unrar/Examples/Perl/unrar.pl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,173 @@
 | 
			
		||||
#Author  : Nikos Vaggalis
 | 
			
		||||
#Website : http://perlingresprogramming.blogspot.com/
 | 
			
		||||
#Email   : nikos.vaggalis@gmail.com
 | 
			
		||||
#Version Date: 16-11-2008
 | 
			
		||||
#To do for next version : better error description instead of just 'dying' plus more informative messages
 | 
			
		||||
#			  add support for using script on files not in script's directory  
 | 
			
		||||
#	  	          comment code			
 | 
			
		||||
#Wrapper for unrar.dll in Perl.Interacts with dll using the Win32::API module
 | 
			
		||||
#For feedback/comments/suggestions please use above email address
 | 
			
		||||
 | 
			
		||||
use Win32::API;
 | 
			
		||||
use Cwd;
 | 
			
		||||
 | 
			
		||||
sub declare_win32_functions {
 | 
			
		||||
    $RAROpenArchiveEx=new Win32::API('unrar.dll','RAROpenArchiveEx','P','N');
 | 
			
		||||
    $RARCloseArchive=new Win32::API('unrar.dll','RARCloseArchive','N','N');
 | 
			
		||||
    $RAROpenArchive=new Win32::API('unrar.dll','RAROpenArchive','P','N');
 | 
			
		||||
    $RARReadHeader=new Win32::API('unrar.dll','RARReadHeader','NP','N');
 | 
			
		||||
    $RARReadHeaderEx=new Win32::API('unrar.dll','RARReadHeaderEx','NP','N');
 | 
			
		||||
    $RARProcessFile=new Win32::API('unrar.dll','RARProcessFile','NNPP','N');
 | 
			
		||||
    $RARSetPassword=new Win32::API('unrar.dll','RARSetPassword','NP','N');
 | 
			
		||||
}
 | 
			
		||||
     
 | 
			
		||||
     
 | 
			
		||||
sub extract_headers {
 | 
			
		||||
    my $file=@_[0];
 | 
			
		||||
    my $CmtBuf = pack('x16384');
 | 
			
		||||
 | 
			
		||||
    my $RAROpenArchiveDataEx=pack('ppLLPLLLLx32',$file,undef,2,0,$CmtBuf,16384,0,0,0);
 | 
			
		||||
    my $RAROpenArchiveData=pack('pLLpLLL',$file,2,0,undef,0,0,0);
 | 
			
		||||
    my $RARHeaderData=pack('x260x260LLLLLLLLLLpLL',0,0,0,0,0,0,0,0,0,0,0,undef,0,0);
 | 
			
		||||
    
 | 
			
		||||
    my $handle = $RAROpenArchiveEx->Call($RAROpenArchiveDataEx)||die "RAROpenArchiveEx failed";
 | 
			
		||||
          
 | 
			
		||||
    my ($arcname,undef,undef,undef,$CmtBuf1,undef,$CmtSize,$CmtState,$flagsEX)=unpack('ppLLP16384LLLLL',$RAROpenArchiveDataEx);
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    !$RARCloseArchive->Call($handle)||die "RARCloseArchive failed";
 | 
			
		||||
  
 | 
			
		||||
    my $handle = $RAROpenArchive->Call($RAROpenArchiveData)||die "RAROpenArchive failed";
 | 
			
		||||
         
 | 
			
		||||
    $flagsEX  & 128 || !$RARReadHeader->Call($handle,$RARHeaderData) || die "RARCloseArchive failed";
 | 
			
		||||
    #!$RARReadHeader->Call($handle,$RARHeaderData)||die "RARReadHeader failed";
 | 
			
		||||
   
 | 
			
		||||
    
 | 
			
		||||
    my ($arcname,$filename,$flags,$packsize)=unpack('A260A260LL',$RARHeaderData);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
   if ($CmtBuf1) {
 | 
			
		||||
	$CmtBuf1=unpack('A'.$CmtSize,$CmtBuf1);
 | 
			
		||||
   }
 | 
			
		||||
   
 | 
			
		||||
    
 | 
			
		||||
  printf("\nArchive %s\n",$arcname);
 | 
			
		||||
  printf("\nVolume:\t\t%s",($flagsEX & 1) ? "yes":"no");
 | 
			
		||||
  printf("\nComment:\t%s",($flagsEX  & 2) ? "yes":"no");
 | 
			
		||||
  printf("\nLocked:\t\t%s",($flagsEX  & 4) ? "yes":"no");
 | 
			
		||||
  printf("\nSolid:\t\t%s",($flagsEX  & 8) ? "yes":"no");
 | 
			
		||||
  printf("\nNew naming:\t%s",($flagsEX  & 16) ? "yes":"no");
 | 
			
		||||
  printf("\nAuthenticity:\t%s",($flagsEX  & 32) ? "yes":"no");
 | 
			
		||||
  printf("\nRecovery:\t%s",($flagsEX  & 64) ? "yes":"no");
 | 
			
		||||
  printf("\nEncr.headers:\t%s",($flagsEX  & 128) ? "yes":"no");
 | 
			
		||||
  printf("\nFirst volume:\t%s",($flagsEX  & 256) ? "yes":"no or older than 3.0");
 | 
			
		||||
  printf("\n\nComments :\n%s",$CmtBuf1) if ($CmtBuf1);
 | 
			
		||||
  print "\n\n";
 | 
			
		||||
  
 | 
			
		||||
 !$RARCloseArchive->Call($handle);
 | 
			
		||||
 return ($flagsEX  & 128,$flags  & 4);
 | 
			
		||||
 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub list_files_in_archive  {
 | 
			
		||||
my $file =@_[0];
 | 
			
		||||
my ($blockencrypted,$locked) = extract_headers($file);
 | 
			
		||||
 | 
			
		||||
my $password;
 | 
			
		||||
 | 
			
		||||
my $RAROpenArchiveDataEx_for_extracting=pack('ppLLpLLLLx32',$file,undef,2,0,undef,0,0,0,0);
 | 
			
		||||
my $handle = $RAROpenArchiveEx->Call($RAROpenArchiveDataEx_for_extracting)||die "RAROpenArchiveEx failed"; 
 | 
			
		||||
my $RARHeaderData=pack('x260x260LLLLLLLLLLpLL',0,0,0,0,0,0,0,0,0,0,0,undef,0,0,0); 
 | 
			
		||||
 | 
			
		||||
if ($blockencrypted){
 | 
			
		||||
    print ("Encrypted headers,enter password: "),chomp ($password=<STDIN>);
 | 
			
		||||
    
 | 
			
		||||
    if ($password) {
 | 
			
		||||
        $RARSetPassword->Call($handle,$password);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	die "\nshould had entered password!!exiting....\n";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    while (($RARReadHeader->Call($handle,$RARHeaderData))==0) {
 | 
			
		||||
       				    my $processresult=$RARProcessFile->Call($handle,0,undef,undef);
 | 
			
		||||
        			    if ($processresult!=0) {
 | 
			
		||||
           				last;
 | 
			
		||||
				    }  
 | 
			
		||||
				    else {
 | 
			
		||||
				       my  @files=unpack('A260A260LLLLLLLLLLpLL',$RARHeaderData);
 | 
			
		||||
                                        print "File\t\t\t\t\tSize\n";
 | 
			
		||||
                                        print "-------------------------------------------\n";
 | 
			
		||||
                                        print "$files[0]\\$files[1]\t\t$files[4]\n\n";
 | 
			
		||||
                                        }
 | 
			
		||||
				     
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
  !$RARCloseArchive->Call($handle)||die "$RARCloseArchive failed";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub process_file {
 | 
			
		||||
my $file=@_[0];
 | 
			
		||||
my ($blockencrypted,$locked) = extract_headers($file);
 | 
			
		||||
 | 
			
		||||
my $errorstatus;
 | 
			
		||||
my $password;
 | 
			
		||||
 | 
			
		||||
my $RAROpenArchiveDataEx_for_extracting=pack('ppLLpLLLLx32',$file,undef,1,0,undef,0,0,0,0);
 | 
			
		||||
my $RARHeaderData=pack('x260x260LLLLLLLLLLpLL',0,0,0,0,0,0,0,0,0,0,0,undef,0,0);
 | 
			
		||||
 
 | 
			
		||||
my $handle = $RAROpenArchiveEx->Call($RAROpenArchiveDataEx_for_extracting)||die "RAROpenArchiveEx failed"; 
 | 
			
		||||
 | 
			
		||||
if ($blockencrypted || $locked){
 | 
			
		||||
    print ("Enter password: "),chomp ($password=<STDIN>);
 | 
			
		||||
    
 | 
			
		||||
    if ($password) {
 | 
			
		||||
        $RARSetPassword->Call($handle,$password);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	die "\nshould had entered password!!exiting....\n";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
    while (($RARReadHeader->Call($handle,$RARHeaderData))==0) {
 | 
			
		||||
       				     my $processresult=$RARProcessFile->Call($handle,2,undef,undef);
 | 
			
		||||
        			    if ($processresult!=0) {
 | 
			
		||||
                                        $errorstatus=$processresult;
 | 
			
		||||
           				last;
 | 
			
		||||
				    }  		
 | 
			
		||||
				     
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
print "Errorstatus : $errorstatus " if $errorstatus;
 | 
			
		||||
!$RARCloseArchive->Call($handle)||die "RRARCloseArchive failed"; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare_win32_functions();
 | 
			
		||||
 | 
			
		||||
my $file;
 | 
			
		||||
if (!defined @ARGV) {
 | 
			
		||||
    print "Usage : perl unrar.pl [option] filename\n";
 | 
			
		||||
    print "where [option] is either X or L. (X=extract,L=List file contents)\n";
 | 
			
		||||
    print "\nThe script and the file to be processed should be in the same directory\n";
 | 
			
		||||
    print "\nExample usage: \nperl unrar.pl L myfile.rar\n";
 | 
			
		||||
    }
 | 
			
		||||
elsif (!defined $ARGV[0] || $ARGV[0] ne "L" && $ARGV[0] ne "X") {  
 | 
			
		||||
    print "Enter mode L or X\n";
 | 
			
		||||
    }
 | 
			
		||||
elsif (!defined $ARGV[1]) {   
 | 
			
		||||
    print ("No filename!") && exit;
 | 
			
		||||
    }
 | 
			
		||||
else {
 | 
			
		||||
    $file=$ARGV[1];
 | 
			
		||||
    if ($ARGV[0] eq "L") {
 | 
			
		||||
                          list_files_in_archive($file);
 | 
			
		||||
                          }
 | 
			
		||||
    elsif ($ARGV[0] eq "X") {
 | 
			
		||||
                          process_file($file);
 | 
			
		||||
                          }
 | 
			
		||||
}    
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user