faq(3)

NAME

Archive::Zip::FAQ - Answers to a few frequently asked
questions about Archive::Zip

DESCRIPTION

It seems that I keep answering the same questions over and
over again. I assume that this is because my documentation
is deficient, rather than that people don't read the docu
mentation.

So this FAQ is an attempt to cut down on the number of
personal answers I have to give. At least I can now say
"You did read the FAQ, right?".

The questions are not in any particular order. The answers
assume the current version of Archive::Zip; some of the
answers depend on newly added/fixed functionality.

Install problems on RedHat 8 or 9 with Perl 5.8.0

Q: Archive::Zip won't install on my RedHat 9 system! It's
broke!

A: This has become something of a FAQ. Basically, RedHat
broke some versions of Perl by setting LANG to UTF8. They
apparently have a fixed version out as an update.

You might try running CPAN or creating your Makefile after
exporting the LANG environment variable as

"LANG=C"

<https://bugzilla.red
hat.com/bugzilla/show_bug.cgi?id=87682>

Why is my zip file so big?

Q: My zip file is actually bigger than what I stored in
it! Why?

A: Some things to make sure of:

Make sure that you are requesting COMPRESSION_DEFLATED if
you are storing strings.
$member->desiredCompressionMethod( COMPRES
SION_DEFLATED );
Don't make lots of little files if you can help it.
Since zip computes the compression tables for each
member, small members without much entropy won't com
press well. Instead, if you've got lots of repeated
strings in your data, try to combine them into one big
member.
Make sure that you are requesting COMPRESSION_STORED if
you are storing things that are already compressed.
If you're storing a .zip, .jpg, .mp3, or other com
pressed file in a zip, then don't compress them again.
They'll get bigger.

Sample code?

Q: Can you send me code to do (whatever)?

A: Have you looked in the "examples/" directory yet? It
contains:

examples/calcSizes.pl -- How to find out how big a Zip
file will be before writing it
examples/copy.pl -- Copies one Zip file to another
examples/extract.pl -- extract file(s) from a Zip
examples/mailZip.pl -- make and mail a zip file
examples/mfh.pl -- demo for use of MockFileHandle
examples/readScalar.pl -- shows how to use IO::Scalar as
the source of a Zip read
examples/selfex.pl -- a brief example of a selfextracting Zip
examples/unzipAll.pl -- uses Archive::Zip::Tree to
unzip an entire Zip
examples/updateZip.pl -- shows how to read/modify/write
a Zip
examples/updateTree.pl -- shows how to update a Zip in
place
examples/writeScalar.pl -- shows how to use IO::Scalar as
the destination of a Zip write
examples/writeScalar2.pl -- shows how to use IO::String as
the destination of a Zip write
examples/zip.pl -- Constructs a Zip file
examples/zipcheck.pl -- One way to check a Zip file
for validity
examples/zipinfo.pl -- Prints out information about a
Zip archive file
examples/zipGrep.pl -- Searches for text in Zip files
examples/ziptest.pl -- Lists a Zip file and checks
member CRCs
examples/ziprecent.pl -- Puts recent files into a zip
file
examples/ziptest.pl -- Another way to check a Zip
file for validity

Can't Read/modify/write same Zip file

Q: Why can't I open a Zip file, add a member, and write it
back? I get an error message when I try.

A: Because Archive::Zip doesn't (and can't, generally)
read file contents into memory, the original Zip file is
required to stay around until the writing of the new file
is completed.

The best way to do this is to write the Zip to a temporary
file and then rename the temporary file to have the old
name (possibly after deleting the old one).

Archive::Zip v1.02 added the archive methods "overwrite()"
and "overwriteAs()" to do this simply and carefully.

See "examples/updateZip.pl" for an example of this tech
nique.

File creation time not set

Q: Upon extracting files, I see that their modification
(and access) times are set to the time in the Zip archive.
However, their creation time is not set to the same time.
Why?

A: Mostly because Perl doesn't give cross-platform access
to creation time. Indeed, many systems (like Unix) don't support such a concept. However, if yours does, you can
easily set it. Get the modification time from the member
using "lastModTime()".

Can't use Archive::Zip on gzip files

Q: Can I use Archive::Zip to extract Unix gzip files?

A: No.

There is a distinction between Unix gzip files, and Zip
archives that also can use the gzip compression.

Depending on the format of the gzip file, you can use Com
press::Zlib, or Archive::Tar to decompress it (and dearchive it in the case of Tar files).

You can unzip PKZIP/WinZip/etc/ archives using
Archive::Zip (that's what it's for) as long as any com
pressed members are compressed using Deflate compression.

Add a directory/tree to a Zip

Q: How can I add a directory (or tree) full of files to a
Zip?

A: You can use the Archive::Zip::addTree*() methods:
use Archive::Zip;
my $zip = Archive::Zip->new();
# add all readable files and directories below . as
xyz/*
$zip->addTree( '.', 'xyz' );
# add all readable plain files below /abc as def/*
$zip->addTree( '/abc', 'def', sub { -f && -r } );
# add all .c files below /tmp as stuff/*
$zip->addTreeMatching( '/tmp', 'stuff', '.c$' );
# add all .o files below /tmp as stuff/* if they aren't
writable
$zip->addTreeMatching( '/tmp', 'stuff', '.o$', sub { !
-w } );
# add all .so files below /tmp that are smaller than
200 bytes as stuff/*
$zip->addTreeMatching( '/tmp', 'stuff', '.o$', sub { -s
< 200 } );
# and write them into a file
$zip->writeToFileNamed('xxx.zip');

Extract a directory/tree

Q: How can I extract some (or all) files from a Zip into a
different directory?

A: You can use the Archive::Zip::extractTree() method: ???
# now extract the same files into /tmpx
$zip->extractTree( 'stuff', '/tmpx' );

Update a directory/tree

Q: How can I update a Zip from a directory tree, adding or
replacing only the newer files?

A: You can use the Archive::Zip::updateTree() method that was added in version 1.09.

Zip times might be off by 1 second

Q: It bothers me greatly that my file times are wrong by
one second about half the time. Why don't you do something
about it?

A: Get over it. This is a result of the Zip format storing
times in DOS format, which has a resolution of only two
seconds.

Zip times don't include time zone information

Q: My file times don't respect time zones. What gives?

A: If this is important to you, please submit patches to
read the various Extra Fields that encode times with time
zones. I'm just using the DOS Date/Time, which doesn't
have a time zone.

How do I make a self-extracting Zip

Q: I want to make a self-extracting Zip file. Can I do
this?

A: Yes. You can write a self-extracting archive stub (that
is, a version of unzip) to the output filehandle that you
pass to writeToFileHandle(). See examples/selfex.pl for how to write a self-extracting archive.

However, you should understand that this will only work on
one kind of platform (the one for which the stub was com
piled).

How can I deal with Zips with prepended garbage (i.e. from Sir

cam)
Q: How can I tell if a Zip has been damaged by adding
garbage to the beginning or inside the file?

A: I added code for this for the Amavis virus scanner. You
can query archives for their 'eocdOffset' property, which
should be 0:
if ($zip->eocdOffset > 0)
{ warn($zip->eocdOffset . " bytes of garbage at begin
ning or within Zip") }
When members are extracted, this offset will be used to
adjust the start of the member if necessary.

Can't extract Shrunk files

Q: I'm trying to extract a file out of a Zip produced by
PKZIP, and keep getting this error message:
error: Unsupported compression combination: read 6,
write 0
A: You can't uncompress this archive member. Archive::Zip
only supports uncompressed members, and compressed members
that are compressed using the compression supported by
Compress::Zlib. That means only Deflated and Stored mem
bers.
Your file is compressed using the Shrink format, which
isn't supported by Compress::Zlib.
You could, perhaps, use a command-line UnZip program (like
the Info-Zip one) to extract this.

Can't do decryption

Q: How do I decrypt encrypted Zip members?

A: With some other program or library. Archive::Zip
doesn't support decryption, and probably never will
(unless you write it).

How to test file integrity?

Q: How can Archive::Zip can test the validity of a Zip
file?

A: If you try to decompress the file, the gzip streams
will report errors if you have garbage. Most of the time.

If you try to open the file and a central directory
structure can't be found, an error will be reported.

When a file is being read, if we can't find a proper PK..
signature in the right places we report a format error.

If there is added garbage at the beginning of a Zip file
(as inserted by some viruses), you can find out about it,
but Archive::Zip will ignore it, and you can still use the
archive. When it gets written back out the added stuff
will be gone.

There are two ready-to-use utilities in the examples
directory that can be used to test file integrity, or that
you can use as examples for your own code:

examples/zipcheck.pl shows how to use an attempted extrac
tion to test a file.
examples/ziptest.pl shows how to test CRCs in a file.

Duplicate files in Zip?

Q: Archive::Zip let me put the same file in my Zip twice!
Why don't you prevent this?

A: As far as I can tell, this is not disallowed by the Zip
spec. If you think it's a bad idea, check for it yourself:
$zip->addFile($someFile, $someName) unless $zip->member
Named($someName);
I can even imagine cases where this might be useful (for
instance, multiple versions of files).

File ownership/permissions/ACLS/etc

Q: Why doesn't Archive::Zip deal with file ownership,
ACLs, etc.?

A: There is no standard way to represent these in the Zip
file format. If you want to send me code to properly han
dle the various extra fields that have been used to repre
sent these through the years, I'll look at it.

I can't compile but ActiveState only has an old version of

Archive::Zip
Q: I've only installed modules using ActiveState's PPM
program and repository. But they have a much older version
of Archive::Zip than is in CPAN. Will you send me a newer
PPM?

A: Probably not, unless I get lots of extra time. But
there's no reason you can't install the version from CPAN.
Archive::Zip is pure Perl, so all you need is NMAKE, which
you can get for free from Microsoft (see the FAQ in the
ActiveState documentation for details on how to install
CPAN modules).

My JPEGs (or MP3's) don't compress when I put them into Zips!

Q: How come my JPEGs and MP3's don't compress much when I
put them into Zips?

A: Because they're already compressed.

Under Windows, things lock up/get damaged

Q: I'm using Windows. When I try to use Archive::Zip, my
machine locks up/makes funny sounds/displays a BSOD/cor
rupts data. How can I fix this?

A: First, try the newest version of Compress::Zlib. I know
of Windows-related problems prior to v1.14 of that
library.

If that doesn't get rid of the problem, fix your computer
or get rid of Windows.

Zip contents in a scalar

Q: I want to read a Zip file from (or write one to) a
scalar variable instead of a file. How can I do this?

A: Use "IO::Scalar" and the "readFromFileHandle()" and
"writeToFileHandle()" methods. See "examples/read
Scalar.pl" and "examples/writeScalar.pl".

Reading from streams

Q: How do I read from a stream (like for the Info-Zip
"funzip" program)?

A: This isn't currently supported, though writing to a
stream is.
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout