Archive-Zip-SimpleZip
view release on metacpan or search on metacpan
lib/Archive/Zip/SimpleZip.pm view on Meta::CPAN
sub _stdPreq
{
my $self = shift;
return 0
if $self->{Error} ;
return $self->_setError(0, "Zip file closed")
if ! $self->{Open} ;
return $self->_setError(0, "openMember filehandle already open")
if defined $self->{Raw};
return 1;
}
sub add
{
my $self = shift;
my $filename = shift;
$self->_stdPreq or return 0 ;
return $self->_setError(0, "File '$filename' does not exist")
if ! -e $filename ;
return $self->_setError(0, "File '$filename' cannot be read")
if ! -r $filename ;
my $options = $self->{Opts}->clone();
my $got = _ckParams($options, 0, @_);
# Force Encode off.
$got->setValue('encode', undef);
my $isLink = $got->getValue('storelinks') && -l $filename ;
my $isDir = -d $filename;
return 0
if $filename eq '.' || $filename eq '..';
if ($options->getValue("canonicalname"))
{
if (! $got->parsed("name"))
{
$got->setValue(name => IO::Compress::Zip::canonicalName($filename, $isDir && ! $isLink));
}
else
{
$got->setValue(name => IO::Compress::Zip::canonicalName($got->getValue("name"), $isDir && ! $isLink));
}
}
my ($mode, $uid, $gid, $size, $atime, $mtime, $ctime) ;
if ( $got->parsed('storelinks') )
{
($mode, $uid, $gid, $size, $atime, $mtime, $ctime)
= (lstat($filename))[2, 4, 5, 7, 8, 9, 10] ;
}
else
{
($mode, $uid, $gid, $size, $atime, $mtime, $ctime)
= (stat($filename))[2, 4, 5,7, 8, 9, 10] ;
}
$got->setValue(time => $mtime);
if (! $got->getValue('minimal')) {
$got->setValue(extime => [$atime, $mtime, $ctime]) ;
use Perl::OSType;
my $type = Perl::OSType::os_type();
if ( $type eq 'Unix' )
{
$got->setValue(exunixn => [$uid, $gid]) ;
}
# TODO add Windows
}
$self->_newStream($filename, $got);
if($isLink)
{
my $target = readlink($filename);
$self->{Zip}->write($target);
}
elsif (-d $filename)
{
# Do nothing, a directory has no payload
}
elsif (-f $filename)
{
my $fh = IO::File->new("<$filename")
or die "Cannot open file $filename: $!";
binmode $fh;
my $data;
my $last ;
while ($fh->read($data, 1024 * 16))
{
$self->{Zip}->write($data);
}
}
else
{
return 0;
}
return 1;
}
sub addString
{
my $self = shift;
my $string = shift;
$self->_stdPreq or return 0 ;
my $options = $self->{Opts}->clone();
( run in 1.264 second using v1.01-cache-2.11-cpan-39bf76dae61 )