|
Packit |
0bf95d |
#!/usr/bin/perl -w
|
|
Packit |
0bf95d |
#
|
|
Packit |
0bf95d |
# Shows one way to write a self-extracting archive file.
|
|
Packit |
0bf95d |
# This is not intended for production use, and it always extracts to a
|
|
Packit |
0bf95d |
# subdirectory with a fixed name.
|
|
Packit |
0bf95d |
# Plus, it requires Perl and A::Z to be installed first.
|
|
Packit |
0bf95d |
#
|
|
Packit |
0bf95d |
# In general, you want to provide a stub that is platform-specific.
|
|
Packit |
0bf95d |
# You can use 'unzipsfx' that it provided with the Info-Zip unzip program.
|
|
Packit |
0bf95d |
# Get this from http://www.info-zip.org .
|
|
Packit |
0bf95d |
#
|
|
Packit |
0bf95d |
# $Revision: 1.6 $
|
|
Packit |
0bf95d |
#
|
|
Packit |
0bf95d |
use strict;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use Archive::Zip;
|
|
Packit |
0bf95d |
use IO::File;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Make a self-extracting Zip file.
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
die "usage: $0 sfxname file [...]\n" unless @ARGV > 1;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $outputName = shift();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $zip = Archive::Zip->new();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
foreach my $file (@ARGV) {
|
|
Packit |
0bf95d |
$zip->addFileOrDirectory($file);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $fh = IO::File->new($outputName, O_CREAT | O_WRONLY | O_TRUNC, 0777)
|
|
Packit |
0bf95d |
or die "Can't open $outputName\: $!\n";
|
|
Packit |
0bf95d |
binmode($fh);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# add self-extracting Perl code
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
while (<DATA>) {
|
|
Packit |
0bf95d |
$fh->print($_)
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$zip->writeToFileHandle($fh);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$fh->close();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# below the __DATA__ line is the extraction stub:
|
|
Packit |
0bf95d |
__DATA__
|
|
Packit |
0bf95d |
#!/usr/local/bin/perl
|
|
Packit |
0bf95d |
# Self-extracting Zip file extraction stub
|
|
Packit |
0bf95d |
# Copyright (C) 2002 Ned Konz
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use Archive::Zip qw(:ERROR_CODES);
|
|
Packit |
0bf95d |
use IO::File;
|
|
Packit |
0bf95d |
use File::Spec;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $dir = 'extracted';
|
|
Packit |
0bf95d |
my $zip = Archive::Zip->new();
|
|
Packit |
0bf95d |
my $fh = IO::File->new($0) or die "Can't open $0\: $!\n";
|
|
Packit |
0bf95d |
die "Zip read error\n" unless $zip->readFromFileHandle($fh) == AZ_OK;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
(mkdir($dir, 0777) or die "Can't create directory $dir\: $!\n") unless -d $dir;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
for my $member ( $zip->members )
|
|
Packit |
0bf95d |
{
|
|
Packit |
0bf95d |
$member->extractToFileNamed( File::Spec->catfile($dir,$member->fileName) );
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
__DATA__
|