Win32-File-Summary
view release on metacpan or search on metacpan
Archive/Tar.pm view on Meta::CPAN
push(@{$self->{'_data'}},$ref);
return 1;
}
# Write a single (probably) file from the in-memory archive to disk
sub extract {
my $self = shift;
my (@files) = @_;
my ($file, $current, @path);
foreach $file (@files) {
foreach (@{$self->{'_data'}}) {
if ($_->{name} eq $file) {
# For the moment, we assume that all paths in tarfiles
# are given according to Unix standards.
# Which they *are*, according to the tar format spec!
(@path) = split(/\//,$file);
$file = pop @path;
$current = cwd;
foreach (@path) {
if (-e $_ && ! -d $_) {
warn "$_ exists but is not a directory!\n";
next;
}
mkdir $_,0777 unless -d $_;
chdir $_;
}
if (not $_->{typeflag}) { # Ordinary file
open(FILE,">".$file);
binmode FILE;
print FILE $_->{'data'};
close FILE;
}
elsif ($_->{typeflag}==5) { # Directory
if (-e $file && ! -d $file) {
drat;
}
mkdir $file,0777 unless -d $file;
}
elsif ($_->{typeflag}==1 || $_->{typeflag}==2) {
symlink $_->{linkname},$file if $symlinks;
}
elsif ($_->{typeflag}==6) {
warn "Doesn't handle named pipes (yet).\n";
return 1;
}
elsif ($_->{typeflag}==4) {
warn "Doesn't handle device files (yet).\n";
return 1;
}
elsif ($_->{typeflag}==3) {
warn "Doesn't handle device files (yet).\n";
return 1;
}
else {
$error = "unknown file type: $_->{typeflag}";
return undef;
}
utime time, $_->{mtime}, $file;
# We are root, and chown exists
if ($>==0 and $^O ne "MacOS" and $^O ne "MSWin32") {
chown $_->{uid},$_->{gid},$file;
}
# chmod is done last, in case it makes file readonly
# (this accomodates DOSish OSes)
chmod $_->{mode},$file;
chdir $current;
}
}
}
}
# Return a list of all filenames in in-memory archive.
sub list_files {
my ($self) = shift;
return map {$_->{name}} @{$self->{'_data'}};
}
### Standard end of module :-)
1;
=head1 NAME
Tar - module for manipulation of tar archives.
=head1 SYNOPSIS
use Archive::Tar;
$tar = Archive::Tar->new();
$tar->read("origin.tar.gz",1);
$tar->add_files("file/foo.c", "file/bar.c");
$tar->add_data("file/baz.c","This is the file contents");
$tar->write("files.tar");
=head1 DESCRIPTION
This is a module for the handling of tar archives.
At the moment these methods are implemented:
=over 4
=item C<new()>
Returns a new Tar object. If given a filename as an argument, it will
try to load that as a tar file. If given a true value as a second
argument, will assume that the tar file is compressed, and will
attempt to read it using L<Compress::Zlib>.
=item C<add_files(@filenamelist)>
Takes a list of filenames and adds them to the in-memory archive.
I suspect that this function will produce bogus tar archives when
used under MacOS, but I'm not sure and I have no Mac to test it on.
=item C<add_data($filename,$data,$opthashref)>
Takes a filename, a scalar full of data and optionally a reference to
a hash with specific options. Will add a file to the in-memory
( run in 1.186 second using v1.01-cache-2.11-cpan-5511b514fd6 )