Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: unable to extract same file twice using Archive::Zip

by Pickwick (Beadle)
on Jul 07, 2010 at 10:19 UTC ( [id://848413]=note: print w/replies, xml ) Need Help??


in reply to unable to extract same file twice using Archive::Zip

I've recreated a test program which shows me error messages on stdout and unzipping more than once really seems to not work for me. I have ActiveState Perl 5.10.1.1007 32 Bit on Win Server 2003 R2 SP2 and Archive::Zip has Version 1.30.

use strict; use Archive::Zip qw(:CONSTANTS :ERROR_CODES); use File::Temp; my $tmp = $ENV{'TEMP'}.'/zip/extractMember'; my $zip = Archive::Zip->new(); if ($zip->read('test.zip') != AZ_OK) { die 'Einlesen klappt nicht.'; } foreach my $member ($zip->members()) { print($member->fileName()."\n"); $member->extractToFileNamed(File::Temp::tempnam($tmp, 'XXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXX')); $member->extractToFileNamed(File::Temp::tempnam($tmp, 'XXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXXX')); }

Output:

Anlagen.zip
format error: CRC or size mismatch while skipping data descriptor
at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 189
Archive::Zip::ZipFileMember::_skipLocalFileHeader('Archive::Zip::ZipFileMember=HASH(0x1c754dc)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 395
Archive::Zip::ZipFileMember::rewindData('Archive::Zip::ZipFileMember=HASH(0x1c754dc)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 990
Archive::Zip::Member::extractToFileHandle('Archive::Zip::ZipFileMember=HASH(0x1c754dc)', 'IO::File=GLOB(0x1c7b924)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 488
Archive::Zip::Member::extractToFileNamed('Archive::Zip::ZipFileMember=HASH(0x1c754dc)', 'D:\Benutzer\TSCHOE~1\LOKALE~1\Temp\zip\extractMember\DKbzQX0R...') called at D:/Benutzer/tschoening/Eigene Dateien/Eclipse/Perltests/StandAlone/zip/extractMember.pl line 18
Anlagen.zip.pk7
format error: CRC or size mismatch while skipping data descriptor
at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 189
Archive::Zip::ZipFileMember::_skipLocalFileHeader('Archive::Zip::ZipFileMember=HASH(0x1c7586c)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 395
Archive::Zip::ZipFileMember::rewindData('Archive::Zip::ZipFileMember=HASH(0x1c7586c)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 990
Archive::Zip::Member::extractToFileHandle('Archive::Zip::ZipFileMember=HASH(0x1c7586c)', 'IO::File=GLOB(0x1c7b934)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 488
Archive::Zip::Member::extractToFileNamed('Archive::Zip::ZipFileMember=HASH(0x1c7586c)', 'D:\Benutzer\TSCHOE~1\LOKALE~1\Temp\zip\extractMember\hrEJi2dV...') called at D:/Benutzer/tschoening/Eigene Dateien/Eclipse/Perltests/StandAlone/zip/extractMember.pl line 18
Testeinreichung AM-SoFT.pdf.p7s
format error: CRC or size mismatch while skipping data descriptor
at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 189
Archive::Zip::ZipFileMember::_skipLocalFileHeader('Archive::Zip::ZipFileMember=HASH(0x1c75a3c)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 395
Archive::Zip::ZipFileMember::rewindData('Archive::Zip::ZipFileMember=HASH(0x1c75a3c)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 990
Archive::Zip::Member::extractToFileHandle('Archive::Zip::ZipFileMember=HASH(0x1c75a3c)', 'IO::File=GLOB(0x1c7bc04)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 488
Archive::Zip::Member::extractToFileNamed('Archive::Zip::ZipFileMember=HASH(0x1c75a3c)', 'D:\Benutzer\TSCHOE~1\LOKALE~1\Temp\zip\extractMember\za1J__f2...') called at D:/Benutzer/tschoening/Eigene Dateien/Eclipse/Perltests/StandAlone/zip/extractMember.pl line 18
Testeinreichung AM-SoFT.pdf
format error: CRC or size mismatch while skipping data descriptor
at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 189
Archive::Zip::ZipFileMember::_skipLocalFileHeader('Archive::Zip::ZipFileMember=HASH(0x1c75c0c)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 395
Archive::Zip::ZipFileMember::rewindData('Archive::Zip::ZipFileMember=HASH(0x1c75c0c)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 990
Archive::Zip::Member::extractToFileHandle('Archive::Zip::ZipFileMember=HASH(0x1c75c0c)', 'IO::File=GLOB(0x1c7b704)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 488
Archive::Zip::Member::extractToFileNamed('Archive::Zip::ZipFileMember=HASH(0x1c75c0c)', 'D:\Benutzer\TSCHOE~1\LOKALE~1\Temp\zip\extractMember\tqEEW0aI...') called at D:/Benutzer/tschoening/Eigene Dateien/Eclipse/Perltests/StandAlone/zip/extractMember.pl line 18
Testeinreichung AM-SoFT_signed.pdf
IO error: reading header signature :
at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 279
Archive::Zip::ZipFileMember::_readDataDescriptor('Archive::Zip::ZipFileMember=HASH(0x1887acc)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 186
Archive::Zip::ZipFileMember::_skipLocalFileHeader('Archive::Zip::ZipFileMember=HASH(0x1887acc)') called at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 395
Archive::Zip::ZipFileMember::rewindData('Archive::Zip::ZipFileMember=HASH(0x1887acc)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 990
Archive::Zip::Member::extractToFileHandle('Archive::Zip::ZipFileMember=HASH(0x1887acc)', 'IO::File=GLOB(0x1c7baa4)') called at C:/Programme/Perl/lib/Archive/Zip/Member.pm line 488
Archive::Zip::Member::extractToFileNamed('Archive::Zip::ZipFileMember=HASH(0x1887acc)', 'D:\Benutzer\TSCHOE~1\LOKALE~1\Temp\zip\extractMember\Nojn_u7h...') called at D:/Benutzer/tschoening/Eigene Dateien/Eclipse/Perltests/StandAlone/zip/extractMember.pl line 18

Replies are listed 'Best First'.
Re^2: unable to extract same file twice using Archive::Zip
by Corion (Patriarch) on Jul 07, 2010 at 10:44 UTC

    Your script (slightly modified) works for me:

    use strict; use Archive::Zip qw(:CONSTANTS :ERROR_CODES); use File::Temp; warn "Using Archive::Zip $Archive::Zip::VERSION"; my $tmp = $ENV{'TEMP'}.'/zip/extractMember'; my $zip = Archive::Zip->new(); if ($zip->read('tmp2.zip') != AZ_OK) { die 'Einlesen klappt nicht.'; } foreach my $member ($zip->members()) { print($member->fileName()."\n"); my $target = File::Temp::tempnam($tmp, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXXX'); print "First"; $member->extractToFileNamed($target); print "\n"; print "Second"; $target = File::Temp::tempnam($tmp, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +X'); $member->extractToFileNamed($target); print "\n"; } __END__ Using Archive::Zip 1.23 at tmp.pl line 5. tmp2.txt First Second

    Note that I'm using an older version of Archive::Zip here. I also don't get the warning about the CRC32 mismatch:

    format error: CRC or size mismatch while skipping data descriptor at C:/Programme/Perl/lib/Archive/Zip/ZipFileMember.pm line 189

    Are you sure that your archive is OK? I created my test archive using 7zip.

    I'll be upgrading to Archive::Zip 1.30 and retest.

    Update: Upgraded to Archive::Zip 1.30 and it still works for me:

    Using Archive::Zip 1.30 at tmp.pl line 5. tmp2.txt First Second

    My guess is that your zip file is broken.

      My guess is that your zip file is broken.

      Seems you are right. I extracted the zip contents using WinRar, recreated a new zip and Archive::Zips handles it fine. The funny thing is, that our software created the zip using the same version of Archive::Zip on it's own, before it extracted it using Archive::Zip again. Seems we are doing something wrong while creating the zip, which doesn't affect extracting the files using other zip programs, but does produce trouble in Archive::Zip when extracting more than once.

      Thanks!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://848413]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2024-03-19 10:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found