Importing Archive::Zip 1.16
[archive-zip.git] / lib / Archive / Zip / FAQ.pod
blob410e81710ae3e392f4ca10e8d862db05813e5774
1 \r
2 =head1 NAME\r
3 \r
4 \r
5 Archive::Zip::FAQ - Answers to a few frequently asked questions about Archive::Zip\r
6 \r
7 =head1 DESCRIPTION\r
8 \r
9 \r
10 It seems that I keep answering the same questions over and over again. I\r
11 assume that this is because my documentation is deficient, rather than that\r
12 people don't read the documentation.\r
15 So this FAQ is an attempt to cut down on the number of personal answers I have\r
16 to give. At least I can now say "You I<did> read the FAQ, right?".\r
19 The questions are not in any particular order. The answers assume the current\r
20 version of Archive::Zip; some of the answers depend on newly added/fixed\r
21 functionality.\r
23 =head1 Install problems on RedHat 8 or 9 with Perl 5.8.0\r
26 B<Q:> Archive::Zip won't install on my RedHat 9 system! It's broke!\r
29 B<A:> This has become something of a FAQ.\r
30 Basically, RedHat broke some versions of Perl by setting LANG to UTF8.\r
31 They apparently have a fixed version out as an update.\r
33 You might try running CPAN or creating your Makefile after exporting the LANG\r
34 environment variable as\r
36 C<LANG=C>\r
38 L<https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=87682>\r
41 =head1 Why is my zip file so big?\r
44 B<Q:> My zip file is actually bigger than what I stored in it! Why?\r
47 B<A:> Some things to make sure of:\r
49 =over 4\r
51 =item Make sure that you are requesting COMPRESSION_DEFLATED if you are storing strings.\r
56 $member->desiredCompressionMethod( COMPRESSION_DEFLATED );\r
59 =item Don't make lots of little files if you can help it.\r
63 Since zip computes the compression tables for each member, small\r
64 members without much entropy won't compress well.  Instead, if you've\r
65 got lots of repeated strings in your data, try to combine them into\r
66 one big member.\r
69 =item Make sure that you are requesting COMPRESSION_STORED if you are storing things that are already compressed.\r
73 If you're storing a .zip, .jpg, .mp3, or other compressed file in a zip,\r
74 then don't compress them again. They'll get bigger.\r
76 =back\r
78 =head1 Sample code?\r
81 B<Q:> Can you send me code to do (whatever)?\r
84 B<A:> Have you looked in the C<examples/> directory yet? It contains:\r
86 =over 4\r
88 =item examples/calcSizes.pl    -- How to find out how big a Zip file will be before writing it\r
92 =item examples/copy.pl         -- Copies one Zip file to another\r
96 =item examples/extract.pl      -- extract file(s) from a Zip\r
100 =item examples/mailZip.pl      -- make and mail a zip file\r
104 =item examples/mfh.pl          -- demo for use of MockFileHandle\r
108 =item examples/readScalar.pl   -- shows how to use IO::Scalar as the source of a Zip read\r
112 =item examples/selfex.pl       -- a brief example of a self-extracting Zip\r
116 =item examples/unzipAll.pl     -- uses Archive::Zip::Tree to unzip an entire Zip\r
120 =item examples/updateZip.pl    -- shows how to read/modify/write a Zip\r
124 =item examples/updateTree.pl   -- shows how to update a Zip in place\r
128 =item examples/writeScalar.pl  -- shows how to use IO::Scalar as the destination of a Zip write\r
132 =item examples/writeScalar2.pl -- shows how to use IO::String as the destination of a Zip write\r
136 =item examples/zip.pl          -- Constructs a Zip file\r
140 =item examples/zipcheck.pl     -- One way to check a Zip file for validity\r
144 =item examples/zipinfo.pl      -- Prints out information about a Zip archive file\r
148 =item examples/zipGrep.pl      -- Searches for text in Zip files\r
152 =item examples/ziptest.pl      -- Lists a Zip file and checks member CRCs\r
156 =item examples/ziprecent.pl    -- Puts recent files into a zipfile\r
160 =item examples/ziptest.pl      -- Another way to check a Zip file for validity\r
164 =back\r
166 =head1 Can't Read/modify/write same Zip file\r
169 B<Q:> Why can't I open a Zip file, add a member, and write it back? I get an\r
170 error message when I try.\r
173 B<A:> Because Archive::Zip doesn't (and can't, generally) read file contents into memory,\r
174 the original Zip file is required to stay around until the writing of the new\r
175 file is completed.\r
178 The best way to do this is to write the Zip to a temporary file and then\r
179 rename the temporary file to have the old name (possibly after deleting the\r
180 old one).\r
183 Archive::Zip v1.02 added the archive methods C<overwrite()> and\r
184 C<overwriteAs()> to do this simply and carefully.\r
187 See C<examples/updateZip.pl> for an example of this technique.\r
189 =head1 File creation time not set\r
192 B<Q:> Upon extracting files, I see that their modification (and access) times are\r
193 set to the time in the Zip archive. However, their creation time is not set to\r
194 the same time. Why?\r
197 B<A:> Mostly because Perl doesn't give cross-platform access to I<creation time>.\r
198 Indeed, many systems (like Unix) don't support such a concept.\r
199 However, if yours does, you can easily set it. Get the modification time from\r
200 the member using C<lastModTime()>.\r
202 =head1 Can't use Archive::Zip on gzip files\r
205 B<Q:> Can I use Archive::Zip to extract Unix gzip files?\r
208 B<A:> No.\r
211 There is a distinction between Unix gzip files, and Zip archives that \r
212 also can use the gzip compression.\r
215 Depending on the format of the gzip file, you can use L<Compress::Zlib>, or\r
216 L<Archive::Tar> to decompress it (and de-archive it in the case of Tar files).\r
219 You can unzip PKZIP/WinZip/etc/ archives using Archive::Zip (that's what \r
220 it's for) as long as any compressed members are compressed using \r
221 Deflate compression.\r
223 =head1 Add a directory/tree to a Zip\r
226 B<Q:> How can I add a directory (or tree) full of files to a Zip?\r
229 B<A:> You can use the Archive::Zip::addTree*() methods:\r
231    use Archive::Zip;\r
232    my $zip = Archive::Zip->new();\r
233    # add all readable files and directories below . as xyz/*\r
234    $zip->addTree( '.', 'xyz' ); \r
235    # add all readable plain files below /abc as def/*\r
236    $zip->addTree( '/abc', 'def', sub { -f && -r } );    \r
237    # add all .c files below /tmp as stuff/*\r
238    $zip->addTreeMatching( '/tmp', 'stuff', '\.c$' );\r
239    # add all .o files below /tmp as stuff/* if they aren't writable\r
240    $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { ! -w } );\r
241    # add all .so files below /tmp that are smaller than 200 bytes as stuff/*\r
242    $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { -s < 200 } );\r
243    # and write them into a file\r
244    $zip->writeToFileNamed('xxx.zip');\r
246 =head1 Extract a directory/tree\r
249 B<Q:> How can I extract some (or all) files from a Zip into a different\r
250 directory?\r
253 B<A:> You can use the Archive::Zip::extractTree() method:\r
254 ??? ||\r
257    # now extract the same files into /tmpx\r
258    $zip->extractTree( 'stuff', '/tmpx' );\r
260 =head1 Update a directory/tree\r
263 B<Q:> How can I update a Zip from a directory tree, adding or replacing only\r
264 the newer files?\r
267 B<A:> You can use the Archive::Zip::updateTree() method that was added in version 1.09.\r
269 =head1 Zip times might be off by 1 second\r
272 B<Q:> It bothers me greatly that my file times are wrong by one second about half\r
273 the time. Why don't you do something about it?\r
276 B<A:> Get over it. This is a result of the Zip format storing times in DOS\r
277 format, which has a resolution of only two seconds.\r
279 =head1 Zip times don't include time zone information\r
282 B<Q:> My file times don't respect time zones. What gives?\r
285 B<A:> If this is important to you, please submit patches to read the various\r
286 Extra Fields that encode times with time zones. I'm just using the DOS\r
287 Date/Time, which doesn't have a time zone.\r
289 =head1 How do I make a self-extracting Zip\r
292 B<Q:> I want to make a self-extracting Zip file. Can I do this?\r
295 B<A:> Yes. You can write a self-extracting archive stub (that is, a version of\r
296 unzip) to the output filehandle that you pass to writeToFileHandle(). See\r
297 examples/selfex.pl for how to write a self-extracting archive.\r
300 However, you should understand that this will only work on one kind of\r
301 platform (the one for which the stub was compiled).\r
303 =head1 How can I deal with Zips with prepended garbage (i.e. from Sircam)\r
306 B<Q:> How can I tell if a Zip has been damaged by adding garbage to the\r
307 beginning or inside the file?\r
310 B<A:> I added code for this for the Amavis virus scanner. You can query archives\r
311 for their 'eocdOffset' property, which should be 0:\r
314   if ($zip->eocdOffset > 0)\r
315     { warn($zip->eocdOffset . " bytes of garbage at beginning or within Zip") }\r
318 When members are extracted, this offset will be used to adjust the start of\r
319 the member if necessary.\r
321 =head1 Can't extract Shrunk files\r
324 B<Q:> I'm trying to extract a file out of a Zip produced by PKZIP, and keep\r
325 getting this error message:\r
328   error: Unsupported compression combination: read 6, write 0\r
331 B<A:> You can't uncompress this archive member. Archive::Zip only supports uncompressed\r
332 members, and compressed members that are compressed using the compression\r
333 supported by Compress::Zlib. That means only Deflated and Stored members.\r
336 Your file is compressed using the Shrink format, which isn't supported by\r
337 Compress::Zlib.\r
340 You could, perhaps, use a command-line UnZip program (like the Info-Zip\r
341 one) to extract this.\r
343 =head1 Can't do decryption\r
346 B<Q:> How do I decrypt encrypted Zip members?\r
349 B<A:> With some other program or library. Archive::Zip doesn't support decryption,\r
350 and probably never will (unless I<you> write it).\r
352 =head1 How to test file integrity?\r
355 B<Q:> How can Archive::Zip can test the validity of a Zip file?\r
358 B<A:> If you try to decompress the file, the gzip streams will report errors \r
359 if you have garbage. Most of the time.\r
361 If you try to open the file and a central directory structure can't be \r
362 found, an error will be reported.\r
364 When a file is being read, if we can't find a proper PK.. signature in \r
365 the right places we report a format error.\r
367 If there is added garbage at the beginning of a Zip file (as inserted \r
368 by some viruses), you can find out about it, but Archive::Zip will ignore it, \r
369 and you can still use the archive. When it gets written back out the \r
370 added stuff will be gone.\r
373 There are two ready-to-use utilities in the examples directory that can\r
374 be used to test file integrity, or that you can use as examples\r
375 for your own code:\r
377 =over 4\r
379 =item examples/zipcheck.pl shows how to use an attempted extraction to test a file.\r
383 =item examples/ziptest.pl shows how to test CRCs in a file.\r
387 =back\r
389 =head1 Duplicate files in Zip?\r
392 B<Q:> Archive::Zip let me put the same file in my Zip twice! Why don't you prevent this?\r
395 B<A:> As far as I can tell, this is not disallowed by the Zip spec. If you\r
396 think it's a bad idea, check for it yourself:\r
399   $zip->addFile($someFile, $someName) unless $zip->memberNamed($someName);\r
402 I can even imagine cases where this might be useful (for instance, multiple\r
403 versions of files).\r
405 =head1 File ownership/permissions/ACLS/etc\r
408 B<Q:> Why doesn't Archive::Zip deal with file ownership, ACLs, etc.?\r
411 B<A:> There is no standard way to represent these in the Zip file format. If\r
412 you want to send me code to properly handle the various extra fields that\r
413 have been used to represent these through the years, I'll look at it.\r
415 =head1 I can't compile but ActiveState only has an old version of Archive::Zip\r
418 B<Q:> I've only installed modules using ActiveState's PPM program and\r
419 repository. But they have a much older version of Archive::Zip than is in CPAN. Will\r
420 you send me a newer PPM?\r
423 B<A:> Probably not, unless I get lots of extra time. But there's no reason you\r
424 can't install the version from CPAN. Archive::Zip is pure Perl, so all you need is\r
425 NMAKE, which you can get for free from Microsoft (see the FAQ in the\r
426 ActiveState documentation for details on how to install CPAN modules).\r
428 =head1 My JPEGs (or MP3's) don't compress when I put them into Zips!\r
431 B<Q:> How come my JPEGs and MP3's don't compress much when I put them into Zips?\r
434 B<A:> Because they're already compressed.\r
436 =head1 Under Windows, things lock up/get damaged\r
439 B<Q:> I'm using Windows. When I try to use Archive::Zip, my machine locks up/makes\r
440 funny sounds/displays a BSOD/corrupts data. How can I fix this?\r
443 B<A:> First, try the newest version of Compress::Zlib. I know of\r
444 Windows-related problems prior to v1.14 of that library.\r
447 If that doesn't get rid of the problem, fix your computer or get rid of\r
448 Windows.\r
450 =head1 Zip contents in a scalar\r
453 B<Q:> I want to read a Zip file from (or write one to) a scalar variable instead\r
454 of a file. How can I do this?\r
457 B<A:> Use C<IO::Scalar> and the C<readFromFileHandle()> and\r
458 C<writeToFileHandle()> methods.\r
459 See C<examples/readScalar.pl> and C<examples/writeScalar.pl>.\r
461 =head1 Reading from streams\r
464 B<Q:> How do I read from a stream (like for the Info-Zip C<funzip> program)?\r
467 B<A:>   This isn't currently supported, though writing to a stream is.\r