1 package IO::Compress::Zip ;
7 use IO::Compress::Base::Common qw(:Status createSelfTiedObject);
8 use IO::Compress::RawDeflate;
9 use IO::Compress::Adapter::Deflate;
10 use IO::Compress::Adapter::Identity;
11 use IO::Compress::Zlib::Extra;
12 use IO::Compress::Zip::Constants;
15 use Compress::Raw::Zlib qw(crc32) ;
18 eval { require IO::Compress::Adapter::Bzip2;
19 import IO::Compress::Adapter::Bzip2;
20 require IO::Compress::Bzip2;
21 import IO::Compress::Bzip2;
28 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
30 $VERSION = '2.000_13';
33 @ISA = qw(Exporter IO::Compress::RawDeflate);
34 @EXPORT_OK = qw( $ZipError zip ) ;
35 %EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
36 push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
38 $EXPORT_TAGS{zip_method} = [qw( ZIP_CM_STORE ZIP_CM_DEFLATE ZIP_CM_BZIP2 )];
39 push @{ $EXPORT_TAGS{all} }, @{ $EXPORT_TAGS{zip_method} };
41 Exporter::export_ok_tags('all');
47 my $obj = createSelfTiedObject($class, \$ZipError);
48 $obj->_create(undef, @_);
53 my $obj = createSelfTiedObject(undef, \$ZipError);
54 return $obj->_def(@_);
63 my ($obj, $errstr, $errno) ;
65 if (*$self->{ZipData}{Method} == ZIP_CM_STORE) {
66 ($obj, $errstr, $errno) = IO::Compress::Adapter::Identity::mkCompObject(
68 $got->value('Strategy')
71 elsif (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
72 ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject(
74 $got->value('Adler32'),
76 $got->value('Strategy')
79 elsif (*$self->{ZipData}{Method} == ZIP_CM_BZIP2) {
80 ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject(
81 $got->value('BlockSize100K'),
82 $got->value('WorkFactor'),
83 $got->value('Verbosity')
85 *$self->{ZipData}{CRC32} = crc32(undef);
88 return $self->saveErrorString(undef, $errstr, $errno)
91 if (! defined *$self->{ZipData}{StartOffset}) {
92 *$self->{ZipData}{StartOffset} = 0;
93 *$self->{ZipData}{Offset} = new U64 ;
103 *$self->{Compress}->reset();
104 *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32('');
109 sub filterUncompressed
113 if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
114 *$self->{ZipData}{CRC32} = *$self->{Compress}->crc32();
117 *$self->{ZipData}{CRC32} = crc32(${$_[0]}, *$self->{ZipData}{CRC32});
127 *$self->{ZipData}{StartOffset} = *$self->{ZipData}{Offset}->get32bit() ;
130 $filename = $param->value('Name') || '';
133 $comment = $param->value('Comment') || '';
137 my $time = _unixToDosTime($param->value('Time'));
143 if (*$self->{ZipData}{Zip64}) {
147 $x .= pack "V V", 0, 0 ; # uncompressedLength
148 $x .= pack "V V", 0, 0 ; # compressedLength
149 $x .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to local hdr
150 #$x .= pack "V ", 0 ; # disk no
152 $x = IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $x);
157 if (! $param->value('Minimal')) {
158 if (defined $param->value('exTime'))
160 $extra .= mkExtendedTime($param->value('MTime'),
161 $param->value('ATime'),
162 $param->value('CTime'));
164 $ctlExtra .= mkExtendedTime($param->value('MTime'));
167 # if ( $param->value('UID'))
169 # $extra .= mkUnixExtra( $param->value('UID'), $param->value('GID'));
170 # $ctlExtra .= mkUnixExtra();
173 $extra .= $param->value('ExtraFieldLocal')
174 if defined $param->value('ExtraFieldLocal');
176 $ctlExtra .= $param->value('ExtraFieldCentral')
177 if defined $param->value('ExtraFieldCentral');
182 $extAttr = $param->value('Mode') << 16
183 if defined $param->value('Mode') ;
186 $gpFlag |= ZIP_GP_FLAG_STREAMING_MASK
187 if *$self->{ZipData}{Stream} ;
189 my $method = *$self->{ZipData}{Method} ;
191 my $version = $ZIP_CM_MIN_VERSIONS{$method};
192 $version = ZIP64_MIN_VERSION
193 if ZIP64_MIN_VERSION > $version && *$self->{ZipData}{Zip64};
194 my $madeBy = ($param->value('OS_Code') << 8) + $version;
195 my $extract = $version;
197 *$self->{ZipData}{Version} = $version;
198 *$self->{ZipData}{MadeBy} = $madeBy;
201 $ifa |= ZIP_IFA_TEXT_MASK
202 if $param->value('TextFlag');
204 $hdr .= pack "V", ZIP_LOCAL_HDR_SIG ; # signature
205 $hdr .= pack 'v', $extract ; # extract Version & OS
206 $hdr .= pack 'v', $gpFlag ; # general purpose flag (set streaming mode)
207 $hdr .= pack 'v', $method ; # compression method (deflate)
208 $hdr .= pack 'V', $time ; # last mod date/time
209 $hdr .= pack 'V', 0 ; # crc32 - 0 when streaming
210 $hdr .= pack 'V', $empty ; # compressed length - 0 when streaming
211 $hdr .= pack 'V', $empty ; # uncompressed length - 0 when streaming
212 $hdr .= pack 'v', length $filename ; # filename length
213 $hdr .= pack 'v', length $extra ; # extra length
221 $ctl .= pack "V", ZIP_CENTRAL_HDR_SIG ; # signature
222 $ctl .= pack 'v', $madeBy ; # version made by
223 $ctl .= pack 'v', $extract ; # extract Version
224 $ctl .= pack 'v', $gpFlag ; # general purpose flag (streaming mode)
225 $ctl .= pack 'v', $method ; # compression method (deflate)
226 $ctl .= pack 'V', $time ; # last mod date/time
227 $ctl .= pack 'V', 0 ; # crc32
228 $ctl .= pack 'V', $empty ; # compressed length
229 $ctl .= pack 'V', $empty ; # uncompressed length
230 $ctl .= pack 'v', length $filename ; # filename length
231 $ctl .= pack 'v', length $ctlExtra ; # extra length
232 $ctl .= pack 'v', length $comment ; # file comment length
233 $ctl .= pack 'v', 0 ; # disk number start
234 $ctl .= pack 'v', $ifa ; # internal file attributes
235 $ctl .= pack 'V', $extAttr ; # external file attributes
236 if (! *$self->{ZipData}{Zip64}) {
237 $ctl .= pack 'V', *$self->{ZipData}{Offset}->get32bit() ; # offset to local header
240 $ctl .= pack 'V', $empty ; # offset to local header
244 *$self->{ZipData}{StartOffset64} = 4 + length $ctl;
248 *$self->{ZipData}{Offset}->add(length $hdr) ;
250 *$self->{ZipData}{CentralHeader} = $ctl;
260 if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
261 $crc32 = pack "V", *$self->{Compress}->crc32();
264 $crc32 = pack "V", *$self->{ZipData}{CRC32};
267 my $ctl = *$self->{ZipData}{CentralHeader} ;
270 if (! *$self->{ZipData}{Zip64}) {
271 $sizes .= *$self->{CompSize}->getPacked_V32() ; # Compressed size
272 $sizes .= *$self->{UnCompSize}->getPacked_V32() ; # Uncompressed size
275 $sizes .= *$self->{CompSize}->getPacked_V64() ; # Compressed size
276 $sizes .= *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size
279 my $data = $crc32 . $sizes ;
284 if (*$self->{ZipData}{Stream}) {
285 $hdr = pack "V", ZIP_DATA_HDR_SIG ; # signature
289 $self->writeAt(*$self->{ZipData}{StartOffset} + 14, $data)
293 if (! *$self->{ZipData}{Zip64})
294 { substr($ctl, 16, length $data) = $data }
296 substr($ctl, 16, length $crc32) = $crc32 ;
297 my $s = *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size
298 $s .= *$self->{CompSize}->getPacked_V64() ; # Compressed size
299 substr($ctl, *$self->{ZipData}{StartOffset64}, length $s) = $s ;
302 *$self->{ZipData}{Offset}->add(length($hdr));
303 *$self->{ZipData}{Offset}->add( *$self->{CompSize} );
304 push @{ *$self->{ZipData}{CentralDir} }, $ctl ;
314 $comment = *$self->{ZipData}{ZipComment} ;
316 my $cd_offset = *$self->{ZipData}{Offset}->get32bit() ; # offset to start central dir
318 my $entries = @{ *$self->{ZipData}{CentralDir} };
319 my $cd = join '', @{ *$self->{ZipData}{CentralDir} };
320 my $cd_len = length $cd ;
324 if ( *$self->{ZipData}{Zip64} ) {
326 my $v = *$self->{ZipData}{Version} ;
327 my $mb = *$self->{ZipData}{MadeBy} ;
328 $z64e .= pack 'v', $v ; # Version made by
329 $z64e .= pack 'v', $mb ; # Version to extract
330 $z64e .= pack 'V', 0 ; # number of disk
331 $z64e .= pack 'V', 0 ; # number of disk with central dir
332 $z64e .= U64::pack_V64 $entries ; # entries in central dir on this disk
333 $z64e .= U64::pack_V64 $entries ; # entries in central dir
334 $z64e .= U64::pack_V64 $cd_len ; # size of central dir
335 $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to start central dir
337 $z64e = pack("V", ZIP64_END_CENTRAL_REC_HDR_SIG) # signature
338 . U64::pack_V64(length $z64e)
341 *$self->{ZipData}{Offset}->add(length $cd) ;
343 $z64e .= pack "V", ZIP64_END_CENTRAL_LOC_HDR_SIG; # signature
344 $z64e .= pack 'V', 0 ; # number of disk with central dir
345 $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to end zip64 central dir
346 $z64e .= pack 'V', 1 ; # Total number of disks
348 # TODO - fix these when info-zip 3 is fixed.
355 $ecd .= pack "V", ZIP_END_CENTRAL_HDR_SIG ; # signature
356 $ecd .= pack 'v', 0 ; # number of disk
357 $ecd .= pack 'v', 0 ; # number of disk with central dir
358 $ecd .= pack 'v', $entries ; # entries in central dir on this disk
359 $ecd .= pack 'v', $entries ; # entries in central dir
360 $ecd .= pack 'V', $cd_len ; # size of central dir
361 $ecd .= pack 'V', $cd_offset ; # offset to start central dir
362 $ecd .= pack 'v', length $comment ; # zipfile comment length
365 return $cd . $z64e . $ecd ;
373 $got->value('CRC32' => 1);
375 if (! $got->parsed('Time') ) {
376 # Modification time defaults to now.
377 $got->value('Time' => time) ;
380 if (! $got->parsed('exTime') ) {
381 my $timeRef = $got->value('exTime');
382 if ( defined $timeRef) {
383 return $self->saveErrorString(undef, "exTime not a 3-element array ref")
384 if ref $timeRef ne 'ARRAY' || @$timeRef != 3;
387 $got->value("MTime", $timeRef->[1]);
388 $got->value("ATime", $timeRef->[0]);
389 $got->value("CTime", $timeRef->[2]);
392 *$self->{ZipData}{Zip64} = $got->value('Zip64');
393 *$self->{ZipData}{Stream} = $got->value('Stream');
395 return $self->saveErrorString(undef, "Zip64 only supported if Stream enabled")
396 if *$self->{ZipData}{Zip64} && ! *$self->{ZipData}{Stream} ;
398 my $method = $got->value('Method');
399 return $self->saveErrorString(undef, "Unknown Method '$method'")
400 if ! defined $ZIP_CM_MIN_VERSIONS{$method};
402 return $self->saveErrorString(undef, "Bzip2 not available")
403 if $method == ZIP_CM_BZIP2 and
404 ! defined $IO::Compress::Adapter::Bzip2::VERSION;
406 *$self->{ZipData}{Method} = $method;
408 *$self->{ZipData}{ZipComment} = $got->value('ZipComment') ;
410 for my $name (qw( ExtraFieldLocal ExtraFieldCentral ))
412 my $data = $got->value($name) ;
414 my $bad = IO::Compress::Zlib::Extra::parseExtraField($data, 1, 0) ;
415 return $self->saveErrorString(undef, "Error with $name Parameter: $bad")
418 $got->value($name, $data) ;
423 if defined $IO::Compress::Bzip2::VERSION
424 and ! IO::Compress::Bzip2::ckParams($self, $got);
433 # return $self->mkHeader(*$self->{Got});
440 use IO::Compress::Base::Common qw(:Parse);
441 use Compress::Raw::Zlib qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
445 @Bzip2 = IO::Compress::Bzip2::getExtraParams($self)
446 if defined $IO::Compress::Bzip2::VERSION;
450 $self->getZlibParams(),
452 'Stream' => [1, 1, Parse_boolean, 1],
453 #'Store' => [0, 1, Parse_boolean, 0],
454 'Method' => [0, 1, Parse_unsigned, ZIP_CM_DEFLATE],
456 # # Zip header fields
457 'Minimal' => [0, 1, Parse_boolean, 0],
458 'Zip64' => [0, 1, Parse_boolean, 0],
459 'Comment' => [0, 1, Parse_any, ''],
460 'ZipComment'=> [0, 1, Parse_any, ''],
461 'Name' => [0, 1, Parse_any, ''],
462 'Time' => [0, 1, Parse_any, undef],
463 'exTime' => [0, 1, Parse_any, undef],
464 'OS_Code' => [0, 1, Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code],
466 'TextFlag' => [0, 1, Parse_boolean, 0],
467 'ExtraFieldLocal' => [0, 1, Parse_any, undef],
468 'ExtraFieldCentral'=> [0, 1, Parse_any, undef],
476 return ('IO::Uncompress::Unzip',
477 \$IO::Uncompress::Unzip::UnzipError);
484 my $filename = shift ;
486 my ($mode, $uid, $gid, $atime, $mtime, $ctime)
487 = (stat($filename))[2, 4,5, 8,9,10] ;
489 $params->value('Name' => $filename)
490 if ! $params->parsed('Name') ;
492 $params->value('Time' => $mtime)
493 if ! $params->parsed('Time') ;
495 if ( ! $params->parsed('exTime'))
497 $params->value('MTime' => $mtime) ;
498 $params->value('ATime' => $atime) ;
499 $params->value('CTime' => $ctime) ;
502 $params->value('Mode' => $mode) ;
504 $params->value('UID' => $uid) ;
505 $params->value('GID' => $gid) ;
511 # order expected is m, a, c
522 $times .= pack("V", $time);
528 #return "UT" . pack("v C", length($times) + 1, $flags) . $times;
529 return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_EXT_TIMESTAMP,
530 pack("C", $flags) . $times);
538 $ids .= pack("v", $id);
541 #return "Ux" . pack("v", length $ids) . $ids;
542 return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_INFO_ZIP_UNIX, $ids);
547 sub _unixToDosTime # Archive::Zip::Member
550 # TODO - add something to cope with unix time < 1980
551 my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t);
553 $dt += ( $sec >> 1 );
554 $dt += ( $min << 5 );
555 $dt += ( $hour << 11 );
556 $dt += ( $mday << 16 );
557 $dt += ( ( $mon + 1 ) << 21 );
558 $dt += ( ( $year - 80 ) << 25 );
570 IO::Compress::Zip - Write zip files/buffers
576 use IO::Compress::Zip qw(zip $ZipError) ;
579 my $status = zip $input => $output [,OPTS]
580 or die "zip failed: $ZipError\n";
582 my $z = new IO::Compress::Zip $output [,OPTS]
583 or die "zip failed: $ZipError\n";
586 $z->printf($format, $string);
588 $z->syswrite($string [, $length, $offset]);
592 $z->seek($position, $whence);
597 $z->input_line_number();
598 $z->newStream( [OPTS] );
609 printf $z $format, $string;
612 seek $z, $position, $whence
622 B<WARNING -- This is a Beta release>.
626 =item * DO NOT use in production code.
628 =item * The documentation is incomplete in places.
630 =item * Parts of the interface defined here are tentative.
632 =item * Please report any problems you find.
639 This module provides a Perl interface that allows writing zip
640 compressed data to files or buffer.
648 Note that IO::Compress::Zip is not intended to be a replacement for the module
651 The primary aim of this module is not as an archiver, but to provide
652 streaming write access to zip file files and buffers.
656 For reading zip files/buffers, see the companion module
657 L<IO::Uncompress::Unzip|IO::Uncompress::Unzip>.
660 =head1 Functional Interface
662 A top-level function, C<zip>, is provided to carry out
663 "one-shot" compression between buffers and/or files. For finer
664 control over the compression process, see the L</"OO Interface">
667 use IO::Compress::Zip qw(zip $ZipError) ;
669 zip $input => $output [,OPTS]
670 or die "zip failed: $ZipError\n";
674 The functional interface needs Perl5.005 or better.
677 =head2 zip $input => $output [, OPTS]
680 C<zip> expects at least two parameters, C<$input> and C<$output>.
682 =head3 The C<$input> parameter
684 The parameter, C<$input>, is used to define the source of
685 the uncompressed data.
687 It can take one of the following forms:
693 If the C<$input> parameter is a simple scalar, it is assumed to be a
694 filename. This file will be opened for reading and the input data
695 will be read from it.
699 If the C<$input> parameter is a filehandle, the input data will be
701 The string '-' can be used as an alias for standard input.
703 =item A scalar reference
705 If C<$input> is a scalar reference, the input data will be read
708 =item An array reference
710 If C<$input> is an array reference, each element in the array must be a
713 The input data will be read from each file in turn.
715 The complete array will be walked to ensure that it only
716 contains valid filenames before any data is compressed.
720 =item An Input FileGlob string
722 If C<$input> is a string that is delimited by the characters "<" and ">"
723 C<zip> will assume that it is an I<input fileglob string>. The
724 input is the list of files that match the fileglob.
726 If the fileglob does not match any files ...
728 See L<File::GlobMapper|File::GlobMapper> for more details.
733 If the C<$input> parameter is any other type, C<undef> will be returned.
736 In addition, if C<$input> is a simple filename, the default values for
737 the C<Name>, C<Time> and C<exTime> options will be sourced from that file.
739 If you do not want to use these defaults they can be overridden by
740 explicitly setting the C<Name>, C<Time> and C<exTime> options or by setting the
741 C<Minimal> parameter.
745 =head3 The C<$output> parameter
747 The parameter C<$output> is used to control the destination of the
748 compressed data. This parameter can take one of these forms.
754 If the C<$output> parameter is a simple scalar, it is assumed to be a
755 filename. This file will be opened for writing and the compressed
756 data will be written to it.
760 If the C<$output> parameter is a filehandle, the compressed data
761 will be written to it.
762 The string '-' can be used as an alias for standard output.
765 =item A scalar reference
767 If C<$output> is a scalar reference, the compressed data will be
768 stored in C<$$output>.
772 =item An Array Reference
774 If C<$output> is an array reference, the compressed data will be
775 pushed onto the array.
777 =item An Output FileGlob
779 If C<$output> is a string that is delimited by the characters "<" and ">"
780 C<zip> will assume that it is an I<output fileglob string>. The
781 output is the list of files that match the fileglob.
783 When C<$output> is an fileglob string, C<$input> must also be a fileglob
784 string. Anything else is an error.
788 If the C<$output> parameter is any other type, C<undef> will be returned.
796 When C<$input> maps to multiple files/buffers and C<$output> is a single
797 file/buffer the input files/buffers will each be stored
798 in C<$output> as a distinct entry.
805 =head2 Optional Parameters
807 Unless specified below, the optional parameters for C<zip>,
808 C<OPTS>, are the same as those used with the OO interface defined in the
809 L</"Constructor Options"> section below.
813 =item C<< AutoClose => 0|1 >>
815 This option applies to any input or output data streams to
816 C<zip> that are filehandles.
818 If C<AutoClose> is specified, and the value is true, it will result in all
819 input and/or output filehandles being closed once C<zip> has
822 This parameter defaults to 0.
825 =item C<< BinModeIn => 0|1 >>
827 When reading from a file or filehandle, set C<binmode> before reading.
835 =item C<< Append => 0|1 >>
846 To read the contents of the file C<file1.txt> and write the compressed
847 data to the file C<file1.txt.zip>.
851 use IO::Compress::Zip qw(zip $ZipError) ;
853 my $input = "file1.txt";
854 zip $input => "$input.zip"
855 or die "zip failed: $ZipError\n";
858 To read from an existing Perl filehandle, C<$input>, and write the
859 compressed data to a buffer, C<$buffer>.
863 use IO::Compress::Zip qw(zip $ZipError) ;
866 my $input = new IO::File "<file1.txt"
867 or die "Cannot open 'file1.txt': $!\n" ;
869 zip $input => \$buffer
870 or die "zip failed: $ZipError\n";
872 To compress all files in the directory "/my/home" that match "*.txt"
873 and store the compressed data in the same directory
877 use IO::Compress::Zip qw(zip $ZipError) ;
879 zip '</my/home/*.txt>' => '<*.zip>'
880 or die "zip failed: $ZipError\n";
882 and if you want to compress each file one at a time, this will do the trick
886 use IO::Compress::Zip qw(zip $ZipError) ;
888 for my $input ( glob "/my/home/*.txt" )
890 my $output = "$input.zip" ;
891 zip $input => $output
892 or die "Error compressing '$input': $ZipError\n";
900 The format of the constructor for C<IO::Compress::Zip> is shown below
902 my $z = new IO::Compress::Zip $output [,OPTS]
903 or die "IO::Compress::Zip failed: $ZipError\n";
905 It returns an C<IO::Compress::Zip> object on success and undef on failure.
906 The variable C<$ZipError> will contain an error message on failure.
908 If you are running Perl 5.005 or better the object, C<$z>, returned from
909 IO::Compress::Zip can be used exactly like an L<IO::File|IO::File> filehandle.
910 This means that all normal output file operations can be carried out
912 For example, to write to a compressed file/buffer you can use either of
915 $z->print("hello world\n");
916 print $z "hello world\n";
918 The mandatory parameter C<$output> is used to control the destination
919 of the compressed data. This parameter can take one of these forms.
925 If the C<$output> parameter is a simple scalar, it is assumed to be a
926 filename. This file will be opened for writing and the compressed data
927 will be written to it.
931 If the C<$output> parameter is a filehandle, the compressed data will be
933 The string '-' can be used as an alias for standard output.
936 =item A scalar reference
938 If C<$output> is a scalar reference, the compressed data will be stored
943 If the C<$output> parameter is any other type, C<IO::Compress::Zip>::new will
946 =head2 Constructor Options
948 C<OPTS> is any combination of the following options:
952 =item C<< AutoClose => 0|1 >>
954 This option is only valid when the C<$output> parameter is a filehandle. If
955 specified, and the value is true, it will result in the C<$output> being
956 closed once either the C<close> method is called or the C<IO::Compress::Zip>
959 This parameter defaults to 0.
961 =item C<< Append => 0|1 >>
963 Opens C<$output> in append mode.
965 The behaviour of this option is dependent on the type of C<$output>.
971 If C<$output> is a buffer and C<Append> is enabled, all compressed data
972 will be append to the end if C<$output>. Otherwise C<$output> will be
973 cleared before any data is written to it.
977 If C<$output> is a filename and C<Append> is enabled, the file will be
978 opened in append mode. Otherwise the contents of the file, if any, will be
979 truncated before any compressed data is written to it.
983 If C<$output> is a filehandle, the file pointer will be positioned to the
984 end of the file via a call to C<seek> before any compressed data is written
985 to it. Otherwise the file pointer will not be moved.
989 This parameter defaults to 0.
993 =item C<< Name => $string >>
995 Stores the contents of C<$string> in the zip filename header field. If
996 C<Name> is not specified, no zip filename field will be created.
998 =item C<< Time => $number >>
1000 Sets the last modified time field in the zip header to $number.
1002 This field defaults to the time the C<IO::Compress::Zip> object was created
1003 if this option is not specified.
1005 =item C<< exTime => [$atime, $mtime, $ctime] >>
1007 This option expects an array reference with exactly three elements:
1008 C<$atime>, C<mtime> and C<$ctime>. These correspond to the last access
1009 time, last modification time and creation time respectively.
1011 It uses these values to set the extended timestamp field in the local zip
1012 header to the three values, $atime, $mtime, $ctime and sets the extended
1013 timestamp field in the central zip header to C<$mtime>.
1015 If the C<Minimal> option is set to true, this option will be ignored.
1017 By default no extended time field is created.
1019 =item C<< Comment => $comment >>
1021 Stores the contents of C<$comment> in the Central File Header of
1024 By default, no comment field is written to the zip file.
1026 =item C<< ZipComment => $comment >>
1028 Stores the contents of C<$comment> in the End of Central Directory record
1031 By default, no comment field is written to the zip file.
1033 =item C<< Method => $method >>
1035 Controls which compression method is used. At present three compression
1036 methods are supported, namely Store (no compression at all), Deflate and
1039 The symbols, ZIP_CM_STORE, ZIP_CM_DEFLATE and ZIP_CM_BZIP2 are used to
1040 select the compression method.
1042 These constants are not imported by C<IO::Compress::Zip> by default.
1044 use IO::Compress::Zip qw(:zip_method);
1045 use IO::Compress::Zip qw(:constants);
1046 use IO::Compress::Zip qw(:all);
1048 Note that to create Bzip2 content, the module C<IO::Compress::Bzip2> must
1049 be installed. A fatal error will be thrown if you attempt to create Bzip2
1050 content when C<IO::Compress::Bzip2> is not available.
1052 The default method is ZIP_CM_DEFLATE.
1054 =item C<< Stream => 0|1 >>
1056 This option controls whether the zip file/buffer output is created in
1059 Note that when outputting to a file with streaming mode disabled (C<Stream>
1060 is 0), the output file must be seekable.
1064 =item C<< TextFlag => 0|1 >>
1066 This parameter controls the setting of a bit in the zip central header. It
1067 is used to signal that the data stored in the zip file/buffer is probably
1072 =item C<< ExtraFieldLocal => $data >>
1073 =item C<< ExtraFieldCentral => $data >>
1075 These options allows additional metadata to be stored in the local and
1076 central headers in the zip file/buffer.
1078 An extra field consists of zero or more subfields. Each subfield consists
1079 of a two byte header followed by the subfield data.
1081 The list of subfields can be supplied in any of the following formats
1083 ExtraFieldLocal => [$id1, $data1,
1088 ExtraFieldLocal => [ [$id1 => $data1],
1093 ExtraFieldLocal => { $id1 => $data1,
1098 Where C<$id1>, C<$id2> are two byte subfield ID's.
1100 If you use the hash syntax, you have no control over the order in which
1101 the ExtraSubFields are stored, plus you cannot have SubFields with
1104 Alternatively the list of subfields can by supplied as a scalar, thus
1106 ExtraField => $rawdata
1110 If the C<Minimal> option is set to true, this option will be ignored.
1112 The maximum size of an extra field 65535 bytes.
1114 =item C<< Minimal => 1|0 >>
1116 If specified, this option will disable the creation of all extended fields
1117 in the zip local and central headers.
1119 This parameter defaults to 0.
1121 =item C<< BlockSize100K => number >>
1123 Specify the number of 100K blocks bzip2 uses during compression.
1125 Valid values are from 1 to 9, where 9 is best compression.
1127 This option is only valid if the C<Method> is ZIP_CM_BZIP2. It is ignored
1132 =item C<< WorkFactor => number >>
1134 Specifies how much effort bzip2 should take before resorting to a slower
1135 fallback compression algorithm.
1137 Valid values range from 0 to 250, where 0 means use the default value 30.
1139 This option is only valid if the C<Method> is ZIP_CM_BZIP2. It is ignored
1149 Defines the compression level used by zlib. The value should either be
1150 a number between 0 and 9 (0 means no compression and 9 is maximum
1151 compression), or one of the symbolic constants defined below.
1156 Z_DEFAULT_COMPRESSION
1158 The default is Z_DEFAULT_COMPRESSION.
1160 Note, these constants are not imported by C<IO::Compress::Zip> by default.
1162 use IO::Compress::Zip qw(:strategy);
1163 use IO::Compress::Zip qw(:constants);
1164 use IO::Compress::Zip qw(:all);
1168 Defines the strategy used to tune the compression. Use one of the symbolic
1169 constants defined below.
1177 The default is Z_DEFAULT_STRATEGY.
1184 =item C<< Strict => 0|1 >>
1188 This is a placeholder option.
1207 Compresses and outputs the contents of the C<$data> parameter. This
1208 has the same behaviour as the C<print> built-in.
1210 Returns true if successful.
1216 $z->printf($format, $data)
1217 printf $z $format, $data
1219 Compresses and outputs the contents of the C<$data> parameter.
1221 Returns true if successful.
1228 $z->syswrite $data, $length
1229 $z->syswrite $data, $length, $offset
1231 Compresses and outputs the contents of the C<$data> parameter.
1233 Returns the number of uncompressed bytes written, or C<undef> if
1241 $z->write $data, $length
1242 $z->write $data, $length, $offset
1244 Compresses and outputs the contents of the C<$data> parameter.
1246 Returns the number of uncompressed bytes written, or C<undef> if
1255 $z->flush($flush_type);
1258 Flushes any pending compressed data to the output file/buffer.
1261 This method takes an optional parameter, C<$flush_type>, that controls
1262 how the flushing will be carried out. By default the C<$flush_type>
1263 used is C<Z_FINISH>. Other valid values for C<$flush_type> are
1264 C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
1265 strongly recommended that you only set the C<flush_type> parameter if
1266 you fully understand the implications of what it does - overuse of C<flush>
1267 can seriously degrade the level of compression achieved. See the C<zlib>
1268 documentation for details.
1271 Returns true on success.
1281 Returns the uncompressed file offset.
1292 Returns true if the C<close> method has been called.
1298 $z->seek($position, $whence);
1299 seek($z, $position, $whence);
1304 Provides a sub-set of the C<seek> functionality, with the restriction
1305 that it is only legal to seek forward in the output file/buffer.
1306 It is a fatal error to attempt to seek backward.
1308 Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
1312 The C<$whence> parameter takes one the usual values, namely SEEK_SET,
1313 SEEK_CUR or SEEK_END.
1315 Returns 1 on success, 0 on failure.
1324 This is a noop provided for completeness.
1330 Returns true if the object currently refers to a opened file/buffer.
1334 my $prev = $z->autoflush()
1335 my $prev = $z->autoflush(EXPR)
1337 If the C<$z> object is associated with a file or a filehandle, this method
1338 returns the current autoflush setting for the underlying filehandle. If
1339 C<EXPR> is present, and is non-zero, it will enable flushing after every
1340 write/print operation.
1342 If C<$z> is associated with a buffer, this method has no effect and always
1345 B<Note> that the special variable C<$|> B<cannot> be used to set or
1346 retrieve the autoflush setting.
1348 =head2 input_line_number
1350 $z->input_line_number()
1351 $z->input_line_number(EXPR)
1354 This method always returns C<undef> when compressing.
1363 If the C<$z> object is associated with a file or a filehandle, this method
1364 will return the underlying file descriptor.
1366 If the C<$z> object is is associated with a buffer, this method will
1376 Flushes any pending compressed data and then closes the output file/buffer.
1380 For most versions of Perl this method will be automatically invoked if
1381 the IO::Compress::Zip object is destroyed (either explicitly or by the
1382 variable with the reference to the object going out of scope). The
1383 exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
1384 these cases, the C<close> method will be called automatically, but
1385 not until global destruction of all live objects when the program is
1388 Therefore, if you want your scripts to be able to run on all versions
1389 of Perl, you should call C<close> explicitly and not rely on automatic
1392 Returns true on success, otherwise 0.
1394 If the C<AutoClose> option has been enabled when the IO::Compress::Zip
1395 object was created, and the object is associated with a file, the
1396 underlying file will also be closed.
1401 =head2 newStream([OPTS])
1405 $z->newStream( [OPTS] )
1407 Closes the current compressed data stream and starts a new one.
1409 OPTS consists of any of the the options that are available when creating
1412 See the L</"Constructor Options"> section for more details.
1415 =head2 deflateParams
1427 A number of symbolic constants are required by some methods in
1428 C<IO::Compress::Zip>. None are imported by default.
1437 Imports C<zip>, C<$ZipError> and all symbolic
1438 constants that can be used by C<IO::Compress::Zip>. Same as doing this
1440 use IO::Compress::Zip qw(zip $ZipError :constants) ;
1444 Import all symbolic constants. Same as doing this
1447 use IO::Compress::Zip qw(:flush :level :strategy :zip_method) ;
1452 These symbolic constants are used by the C<flush> method.
1463 These symbolic constants are used by the C<Level> option in the constructor.
1468 Z_DEFAULT_COMPRESSION
1473 These symbolic constants are used by the C<Strategy> option in the constructor.
1484 These symbolic constants are used by the C<Method> option in the
1514 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>
1516 L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
1518 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
1519 L<Archive::Tar|Archive::Tar>,
1520 L<IO::Zlib|IO::Zlib>
1523 For RFC 1950, 1951 and 1952 see
1524 F<http://www.faqs.org/rfcs/rfc1950.html>,
1525 F<http://www.faqs.org/rfcs/rfc1951.html> and
1526 F<http://www.faqs.org/rfcs/rfc1952.html>
1528 The I<zlib> compression library was written by Jean-loup Gailly
1529 F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
1531 The primary site for the I<zlib> compression library is
1532 F<http://www.zlib.org>.
1534 The primary site for gzip is F<http://www.gzip.org>.
1541 This module was written by Paul Marquess, F<pmqs@cpan.org>.
1545 =head1 MODIFICATION HISTORY
1547 See the Changes file.
1549 =head1 COPYRIGHT AND LICENSE
1551 Copyright (c) 2005-2006 Paul Marquess. All rights reserved.
1553 This program is free software; you can redistribute it and/or
1554 modify it under the same terms as Perl itself.