1 package IO::Compress::Zip ;
7 use IO::Compress::Base::Common qw(createSelfTiedObject);
8 use IO::Compress::RawDeflate;
9 use IO::Compress::Adapter::Deflate;
10 use IO::Compress::Adapter::Identity;
14 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
16 $VERSION = '2.000_10';
19 @ISA = qw(Exporter IO::Compress::RawDeflate);
20 @EXPORT_OK = qw( $ZipError zip ) ;
21 %EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
22 push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
23 Exporter::export_ok_tags('all');
30 my $obj = createSelfTiedObject($class, \$ZipError);
31 $obj->_create(undef, @_);
36 my $obj = createSelfTiedObject(undef, \$ZipError);
37 return $obj->_def(@_);
46 my ($obj, $errstr, $errno) ;
48 if (*$self->{ZipData}{Store}) {
49 ($obj, $errstr, $errno) = IO::Compress::Adapter::Identity::mkCompObject(
51 $got->value('Adler32'),
53 $got->value('Strategy')
57 ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject(
59 $got->value('Adler32'),
61 $got->value('Strategy')
65 return $self->saveErrorString(undef, $errstr, $errno)
68 if (! defined *$self->{ZipData}{StartOffset}) {
69 *$self->{ZipData}{StartOffset} = *$self->{ZipData}{Offset} = 0;
83 $filename = $param->value('Name') || '';
86 $comment = $param->value('Comment') || '';
88 my $extract = $param->value('OS_Code') << 8 + 20 ;
91 my $time = _unixToDosTime($param->value('Time'));
92 *$self->{ZipData}{StartOffset} = *$self->{ZipData}{Offset} ;
94 my $strm = *$self->{ZipData}{Stream} ? 8 : 0 ;
95 my $method = *$self->{ZipData}{Store} ? 0 : 8 ;
97 $hdr .= pack "V", 0x04034b50 ; # signature
98 $hdr .= pack 'v', $extract ; # extract Version & OS
99 $hdr .= pack 'v', $strm ; # general purpose flag (set streaming mode)
100 $hdr .= pack 'v', $method ; # compression method (deflate)
101 $hdr .= pack 'V', $time ; # last mod date/time
102 $hdr .= pack 'V', 0 ; # crc32 - 0 when streaming
103 $hdr .= pack 'V', 0 ; # compressed length - 0 when streaming
104 $hdr .= pack 'V', 0 ; # uncompressed length - 0 when streaming
105 $hdr .= pack 'v', length $filename ; # filename length
106 $hdr .= pack 'v', 0 ; # extra length
113 $ctl .= pack "V", 0x02014b50 ; # signature
114 $ctl .= pack 'v', $extract ; # version made by
115 $ctl .= pack 'v', $extract ; # extract Version
116 $ctl .= pack 'v', $strm ; # general purpose flag (streaming mode)
117 $ctl .= pack 'v', $method ; # compression method (deflate)
118 $ctl .= pack 'V', $time ; # last mod date/time
119 $ctl .= pack 'V', 0 ; # crc32
120 $ctl .= pack 'V', 0 ; # compressed length
121 $ctl .= pack 'V', 0 ; # uncompressed length
122 $ctl .= pack 'v', length $filename ; # filename length
123 $ctl .= pack 'v', 0 ; # extra length
124 $ctl .= pack 'v', length $comment ; # file comment length
125 $ctl .= pack 'v', 0 ; # disk number start
126 $ctl .= pack 'v', 0 ; # internal file attributes
127 $ctl .= pack 'V', 0 ; # external file attributes
128 $ctl .= pack 'V', *$self->{ZipData}{Offset} ; # offset to local header
134 *$self->{ZipData}{Offset} += length $hdr ;
136 *$self->{ZipData}{CentralHeader} = $ctl;
145 my $crc32 = *$self->{Compress}->crc32();
146 my $compressedBytes = *$self->{Compress}->compressedBytes();
147 my $uncompressedBytes = *$self->{Compress}->uncompressedBytes();
150 $data .= pack "V", $crc32 ; # CRC32
151 $data .= pack "V", $compressedBytes ; # Compressed Size
152 $data .= pack "V", $uncompressedBytes; # Uncompressed Size
156 if (*$self->{ZipData}{Stream}) {
157 $hdr = pack "V", 0x08074b50 ; # signature
161 $self->writeAt(*$self->{ZipData}{StartOffset} + 14, $data)
165 my $ctl = *$self->{ZipData}{CentralHeader} ;
166 substr($ctl, 16, 12) = $data ;
167 #substr($ctl, 16, 4) = pack "V", $crc32 ; # CRC32
168 #substr($ctl, 20, 4) = pack "V", $compressedBytes ; # Compressed Size
169 #substr($ctl, 24, 4) = pack "V", $uncompressedBytes ; # Uncompressed Size
171 *$self->{ZipData}{Offset} += length($hdr) + $compressedBytes;
172 push @{ *$self->{ZipData}{CentralDir} }, $ctl ;
182 $comment = *$self->{ZipData}{ZipComment} ;
184 my $entries = @{ *$self->{ZipData}{CentralDir} };
185 my $cd = join '', @{ *$self->{ZipData}{CentralDir} };
188 $ecd .= pack "V", 0x06054b50 ; # signature
189 $ecd .= pack 'v', 0 ; # number of disk
190 $ecd .= pack 'v', 0 ; # number if disk with central dir
191 $ecd .= pack 'v', $entries ; # entries in central dir on this disk
192 $ecd .= pack 'v', $entries ; # entries in central dir
193 $ecd .= pack 'V', length $cd ; # size of central dir
194 $ecd .= pack 'V', *$self->{ZipData}{Offset} ; # offset to start central dir
195 $ecd .= pack 'v', length $comment ; # zipfile comment length
206 $got->value('CRC32' => 1);
208 if (! $got->parsed('Time') ) {
209 # Modification time defaults to now.
210 $got->value('Time' => time) ;
213 *$self->{ZipData}{Stream} = $got->value('Stream');
214 *$self->{ZipData}{Store} = $got->value('Store');
215 *$self->{ZipData}{ZipComment} = $got->value('ZipComment') ;
225 # return $self->mkHeader(*$self->{Got});
232 use IO::Compress::Base::Common qw(:Parse);
233 use Compress::Raw::Zlib qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
238 $self->getZlibParams(),
240 'Stream' => [1, 1, Parse_boolean, 1],
241 'Store' => [0, 1, Parse_boolean, 0],
243 # # Zip header fields
244 # 'Minimal' => [0, 1, Parse_boolean, 0],
245 'Comment' => [0, 1, Parse_any, ''],
246 'ZipComment'=> [0, 1, Parse_any, ''],
247 'Name' => [0, 1, Parse_any, ''],
248 'Time' => [0, 1, Parse_any, undef],
249 'OS_Code' => [0, 1, Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code],
251 # 'TextFlag' => [0, 1, Parse_boolean, 0],
252 # 'ExtraField'=> [0, 1, Parse_string, ''],
258 return ('IO::Uncompress::Unzip',
259 \$IO::Uncompress::Unzip::UnzipError);
266 my $filename = shift ;
268 my $defaultTime = (stat($filename))[9] ;
270 $params->value('Name' => $filename)
271 if ! $params->parsed('Name') ;
273 $params->value('Time' => $defaultTime)
274 if ! $params->parsed('Time') ;
280 sub _unixToDosTime # Archive::Zip::Member
283 # TODO - add something to cope with unix time < 1980
284 my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t);
286 $dt += ( $sec >> 1 );
287 $dt += ( $min << 5 );
288 $dt += ( $hour << 11 );
289 $dt += ( $mday << 16 );
290 $dt += ( ( $mon + 1 ) << 21 );
291 $dt += ( ( $year - 80 ) << 25 );
303 IO::Compress::Zip - Write zip files/buffers
309 use IO::Compress::Zip qw(zip $ZipError) ;
312 my $status = zip $input => $output [,OPTS]
313 or die "zip failed: $ZipError\n";
315 my $z = new IO::Compress::Zip $output [,OPTS]
316 or die "zip failed: $ZipError\n";
319 $z->printf($format, $string);
321 $z->syswrite($string [, $length, $offset]);
325 $z->seek($position, $whence);
330 $z->input_line_number();
331 $z->newStream( [OPTS] );
342 printf $z $format, $string;
345 seek $z, $position, $whence
355 B<WARNING -- This is a Beta release>.
359 =item * DO NOT use in production code.
361 =item * The documentation is incomplete in places.
363 =item * Parts of the interface defined here are tentative.
365 =item * Please report any problems you find.
372 This module provides a Perl interface that allows writing zip
373 compressed data to files or buffer.
381 Note that IO::Compress::Zip is not intended to be a replacement for the module
384 The primary aim of this module is not as an archiver, but to provide
385 streaming write access to zip file files and buffers.
389 For reading zip files/buffers, see the companion module
390 L<IO::Uncompress::Unzip|IO::Uncompress::Unzip>.
393 =head1 Functional Interface
395 A top-level function, C<zip>, is provided to carry out
396 "one-shot" compression between buffers and/or files. For finer
397 control over the compression process, see the L</"OO Interface">
400 use IO::Compress::Zip qw(zip $ZipError) ;
402 zip $input => $output [,OPTS]
403 or die "zip failed: $ZipError\n";
407 The functional interface needs Perl5.005 or better.
410 =head2 zip $input => $output [, OPTS]
413 C<zip> expects at least two parameters, C<$input> and C<$output>.
415 =head3 The C<$input> parameter
417 The parameter, C<$input>, is used to define the source of
418 the uncompressed data.
420 It can take one of the following forms:
426 If the C<$input> parameter is a simple scalar, it is assumed to be a
427 filename. This file will be opened for reading and the input data
428 will be read from it.
432 If the C<$input> parameter is a filehandle, the input data will be
434 The string '-' can be used as an alias for standard input.
436 =item A scalar reference
438 If C<$input> is a scalar reference, the input data will be read
441 =item An array reference
443 If C<$input> is an array reference, each element in the array must be a
446 The input data will be read from each file in turn.
448 The complete array will be walked to ensure that it only
449 contains valid filenames before any data is compressed.
453 =item An Input FileGlob string
455 If C<$input> is a string that is delimited by the characters "<" and ">"
456 C<zip> will assume that it is an I<input fileglob string>. The
457 input is the list of files that match the fileglob.
459 If the fileglob does not match any files ...
461 See L<File::GlobMapper|File::GlobMapper> for more details.
466 If the C<$input> parameter is any other type, C<undef> will be returned.
469 In addition, if C<$input> is a simple filename, the default values for
470 the C<Name> and C<Time> options will be sourced from that file.
472 If you do not want to use these defaults they can be overridden by
473 explicitly setting the C<Name> and C<Time> options or by setting the
474 C<Minimal> parameter.
478 =head3 The C<$output> parameter
480 The parameter C<$output> is used to control the destination of the
481 compressed data. This parameter can take one of these forms.
487 If the C<$output> parameter is a simple scalar, it is assumed to be a
488 filename. This file will be opened for writing and the compressed
489 data will be written to it.
493 If the C<$output> parameter is a filehandle, the compressed data
494 will be written to it.
495 The string '-' can be used as an alias for standard output.
498 =item A scalar reference
500 If C<$output> is a scalar reference, the compressed data will be
501 stored in C<$$output>.
505 =item An Array Reference
507 If C<$output> is an array reference, the compressed data will be
508 pushed onto the array.
510 =item An Output FileGlob
512 If C<$output> is a string that is delimited by the characters "<" and ">"
513 C<zip> will assume that it is an I<output fileglob string>. The
514 output is the list of files that match the fileglob.
516 When C<$output> is an fileglob string, C<$input> must also be a fileglob
517 string. Anything else is an error.
521 If the C<$output> parameter is any other type, C<undef> will be returned.
527 When C<$input> maps to multiple files/buffers and C<$output> is a single
528 file/buffer the compressed input files/buffers will all be stored
529 in C<$output> as a single compressed stream.
533 =head2 Optional Parameters
535 Unless specified below, the optional parameters for C<zip>,
536 C<OPTS>, are the same as those used with the OO interface defined in the
537 L</"Constructor Options"> section below.
541 =item AutoClose =E<gt> 0|1
543 This option applies to any input or output data streams to
544 C<zip> that are filehandles.
546 If C<AutoClose> is specified, and the value is true, it will result in all
547 input and/or output filehandles being closed once C<zip> has
550 This parameter defaults to 0.
554 =item BinModeIn =E<gt> 0|1
556 When reading from a file or filehandle, set C<binmode> before reading.
564 =item -Append =E<gt> 0|1
575 To read the contents of the file C<file1.txt> and write the compressed
576 data to the file C<file1.txt.zip>.
580 use IO::Compress::Zip qw(zip $ZipError) ;
582 my $input = "file1.txt";
583 zip $input => "$input.zip"
584 or die "zip failed: $ZipError\n";
587 To read from an existing Perl filehandle, C<$input>, and write the
588 compressed data to a buffer, C<$buffer>.
592 use IO::Compress::Zip qw(zip $ZipError) ;
595 my $input = new IO::File "<file1.txt"
596 or die "Cannot open 'file1.txt': $!\n" ;
598 zip $input => \$buffer
599 or die "zip failed: $ZipError\n";
601 To compress all files in the directory "/my/home" that match "*.txt"
602 and store the compressed data in the same directory
606 use IO::Compress::Zip qw(zip $ZipError) ;
608 zip '</my/home/*.txt>' => '<*.zip>'
609 or die "zip failed: $ZipError\n";
611 and if you want to compress each file one at a time, this will do the trick
615 use IO::Compress::Zip qw(zip $ZipError) ;
617 for my $input ( glob "/my/home/*.txt" )
619 my $output = "$input.zip" ;
620 zip $input => $output
621 or die "Error compressing '$input': $ZipError\n";
629 The format of the constructor for C<IO::Compress::Zip> is shown below
631 my $z = new IO::Compress::Zip $output [,OPTS]
632 or die "IO::Compress::Zip failed: $ZipError\n";
634 It returns an C<IO::Compress::Zip> object on success and undef on failure.
635 The variable C<$ZipError> will contain an error message on failure.
637 If you are running Perl 5.005 or better the object, C<$z>, returned from
638 IO::Compress::Zip can be used exactly like an L<IO::File|IO::File> filehandle.
639 This means that all normal output file operations can be carried out
641 For example, to write to a compressed file/buffer you can use either of
644 $z->print("hello world\n");
645 print $z "hello world\n";
647 The mandatory parameter C<$output> is used to control the destination
648 of the compressed data. This parameter can take one of these forms.
654 If the C<$output> parameter is a simple scalar, it is assumed to be a
655 filename. This file will be opened for writing and the compressed data
656 will be written to it.
660 If the C<$output> parameter is a filehandle, the compressed data will be
662 The string '-' can be used as an alias for standard output.
665 =item A scalar reference
667 If C<$output> is a scalar reference, the compressed data will be stored
672 If the C<$output> parameter is any other type, C<IO::Compress::Zip>::new will
675 =head2 Constructor Options
677 C<OPTS> is any combination of the following options:
681 =item AutoClose =E<gt> 0|1
683 This option is only valid when the C<$output> parameter is a filehandle. If
684 specified, and the value is true, it will result in the C<$output> being
685 closed once either the C<close> method is called or the C<IO::Compress::Zip>
688 This parameter defaults to 0.
690 =item Append =E<gt> 0|1
692 Opens C<$output> in append mode.
694 The behaviour of this option is dependent on the type of C<$output>.
700 If C<$output> is a buffer and C<Append> is enabled, all compressed data
701 will be append to the end if C<$output>. Otherwise C<$output> will be
702 cleared before any data is written to it.
706 If C<$output> is a filename and C<Append> is enabled, the file will be
707 opened in append mode. Otherwise the contents of the file, if any, will be
708 truncated before any compressed data is written to it.
712 If C<$output> is a filehandle, the file pointer will be positioned to the
713 end of the file via a call to C<seek> before any compressed data is written
714 to it. Otherwise the file pointer will not be moved.
718 This parameter defaults to 0.
727 Defines the compression level used by zlib. The value should either be
728 a number between 0 and 9 (0 means no compression and 9 is maximum
729 compression), or one of the symbolic constants defined below.
734 Z_DEFAULT_COMPRESSION
736 The default is Z_DEFAULT_COMPRESSION.
738 Note, these constants are not imported by C<IO::Compress::Zip> by default.
740 use IO::Compress::Zip qw(:strategy);
741 use IO::Compress::Zip qw(:constants);
742 use IO::Compress::Zip qw(:all);
746 Defines the strategy used to tune the compression. Use one of the symbolic
747 constants defined below.
755 The default is Z_DEFAULT_STRATEGY.
762 =item -Strict =E<gt> 0|1
766 This is a placeholder option.
785 Compresses and outputs the contents of the C<$data> parameter. This
786 has the same behaviour as the C<print> built-in.
788 Returns true if successful.
794 $z->printf($format, $data)
795 printf $z $format, $data
797 Compresses and outputs the contents of the C<$data> parameter.
799 Returns true if successful.
806 $z->syswrite $data, $length
807 $z->syswrite $data, $length, $offset
809 Compresses and outputs the contents of the C<$data> parameter.
811 Returns the number of uncompressed bytes written, or C<undef> if
819 $z->write $data, $length
820 $z->write $data, $length, $offset
822 Compresses and outputs the contents of the C<$data> parameter.
824 Returns the number of uncompressed bytes written, or C<undef> if
833 $z->flush($flush_type);
836 Flushes any pending compressed data to the output file/buffer.
839 This method takes an optional parameter, C<$flush_type>, that controls
840 how the flushing will be carried out. By default the C<$flush_type>
841 used is C<Z_FINISH>. Other valid values for C<$flush_type> are
842 C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
843 strongly recommended that you only set the C<flush_type> parameter if
844 you fully understand the implications of what it does - overuse of C<flush>
845 can seriously degrade the level of compression achieved. See the C<zlib>
846 documentation for details.
849 Returns true on success.
859 Returns the uncompressed file offset.
870 Returns true if the C<close> method has been called.
876 $z->seek($position, $whence);
877 seek($z, $position, $whence);
882 Provides a sub-set of the C<seek> functionality, with the restriction
883 that it is only legal to seek forward in the output file/buffer.
884 It is a fatal error to attempt to seek backward.
886 Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
890 The C<$whence> parameter takes one the usual values, namely SEEK_SET,
891 SEEK_CUR or SEEK_END.
893 Returns 1 on success, 0 on failure.
902 This is a noop provided for completeness.
908 Returns true if the object currently refers to a opened file/buffer.
912 my $prev = $z->autoflush()
913 my $prev = $z->autoflush(EXPR)
915 If the C<$z> object is associated with a file or a filehandle, this method
916 returns the current autoflush setting for the underlying filehandle. If
917 C<EXPR> is present, and is non-zero, it will enable flushing after every
918 write/print operation.
920 If C<$z> is associated with a buffer, this method has no effect and always
923 B<Note> that the special variable C<$|> B<cannot> be used to set or
924 retrieve the autoflush setting.
926 =head2 input_line_number
928 $z->input_line_number()
929 $z->input_line_number(EXPR)
932 This method always returns C<undef> when compressing.
941 If the C<$z> object is associated with a file or a filehandle, this method
942 will return the underlying file descriptor.
944 If the C<$z> object is is associated with a buffer, this method will
954 Flushes any pending compressed data and then closes the output file/buffer.
958 For most versions of Perl this method will be automatically invoked if
959 the IO::Compress::Zip object is destroyed (either explicitly or by the
960 variable with the reference to the object going out of scope). The
961 exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
962 these cases, the C<close> method will be called automatically, but
963 not until global destruction of all live objects when the program is
966 Therefore, if you want your scripts to be able to run on all versions
967 of Perl, you should call C<close> explicitly and not rely on automatic
970 Returns true on success, otherwise 0.
972 If the C<AutoClose> option has been enabled when the IO::Compress::Zip
973 object was created, and the object is associated with a file, the
974 underlying file will also be closed.
979 =head2 newStream([OPTS])
983 $z->newStream( [OPTS] )
985 Closes the current compressed data stream and starts a new one.
987 OPTS consists of the following sub-set of the the options that are
988 available when creating the C<$z> object,
1001 =head2 deflateParams
1013 A number of symbolic constants are required by some methods in
1014 C<IO::Compress::Zip>. None are imported by default.
1023 Imports C<zip>, C<$ZipError> and all symbolic
1024 constants that can be used by C<IO::Compress::Zip>. Same as doing this
1026 use IO::Compress::Zip qw(zip $ZipError :constants) ;
1030 Import all symbolic constants. Same as doing this
1032 use IO::Compress::Zip qw(:flush :level :strategy) ;
1036 These symbolic constants are used by the C<flush> method.
1047 These symbolic constants are used by the C<Level> option in the constructor.
1052 Z_DEFAULT_COMPRESSION
1057 These symbolic constants are used by the C<Strategy> option in the constructor.
1081 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
1083 L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
1085 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
1086 L<Archive::Tar|Archive::Tar>,
1087 L<IO::Zlib|IO::Zlib>
1090 For RFC 1950, 1951 and 1952 see
1091 F<http://www.faqs.org/rfcs/rfc1950.html>,
1092 F<http://www.faqs.org/rfcs/rfc1951.html> and
1093 F<http://www.faqs.org/rfcs/rfc1952.html>
1095 The I<zlib> compression library was written by Jean-loup Gailly
1096 F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
1098 The primary site for the I<zlib> compression library is
1099 F<http://www.zlib.org>.
1101 The primary site for gzip is F<http://www.gzip.org>.
1108 This module was written by Paul Marquess, F<pmqs@cpan.org>.
1112 =head1 MODIFICATION HISTORY
1114 See the Changes file.
1116 =head1 COPYRIGHT AND LICENSE
1118 Copyright (c) 2005-2006 Paul Marquess. All rights reserved.
1120 This program is free software; you can redistribute it and/or
1121 modify it under the same terms as Perl itself.