From: Perl 5 Porters Date: Wed, 7 Feb 1996 21:55:01 +0000 (+0000) Subject: New file, part of MakeMaker-5.21 upgrade. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f716a1dd8e78fd29a728ad4e8781976804f9d620;p=p5sagit%2Fp5-mst-13.2.git New file, part of MakeMaker-5.21 upgrade. --- diff --git a/lib/File/Copy.pm b/lib/File/Copy.pm new file mode 100644 index 0000000..b4a075d --- /dev/null +++ b/lib/File/Copy.pm @@ -0,0 +1,148 @@ +# File/Copy.pm. Written in 1994 by Aaron Sherman . This +# source code has been placed in the public domain by the author. +# Please be kind and preserve the documentation. +# + +package File::Copy; + +require Exporter; +use Carp; + +@ISA=qw(Exporter); +@EXPORT=qw(copy); +@EXPORT_OK=qw(copy cp); + +$File::Copy::VERSION = '1.5'; +$File::Copy::Too_Big = 1024 * 1024 * 2; + +sub VERSION { + # Version of File::Copy + return $File::Copy::VERSION; +} + +sub copy { + croak("Usage: copy( file1, file2 [, buffersize]) ") + unless(@_ == 2 || @_ == 3); + + my $from = shift; + my $to = shift; + my $recsep = $\; + my $closefrom=0; + my $closeto=0; + my ($size, $status, $r, $buf); + local(*FROM, *TO); + + $\ = ''; + + if (ref(\$from) eq 'GLOB') { + *FROM = $from; + } elsif (defined ref $from and + (ref($from) eq 'GLOB' || ref($from) eq 'FileHandle')) { + *FROM = *$from; + } else { + open(FROM,"<$from")||goto(fail_open1); + $closefrom = 1; + } + + if (ref(\$to) eq 'GLOB') { + *TO = $to; + } elsif (defined ref $to and + (ref($to) eq 'GLOB' || ref($to) eq 'FileHandle')) { + *TO = *$to; + } else { + open(TO,">$to")||goto(fail_open2); + $closeto=1; + } + + if (@_) { + $size = shift(@_) + 0; + croak("Bad buffer size for copy: $size\n") unless ($size > 0); + } else { + $size = -s FROM; + $size = 1024 if ($size < 512); + $size = $File::Copy::Too_Big if ($size > $File::Copy::Too_Big); + } + + $buf = ''; + while(defined($r = read(FROM,$buf,$size)) && $r > 0) { + if (syswrite (TO,$buf,$r) != $r) { + goto fail_inner; + } + } + goto fail_inner unless(defined($r)); + close(TO) || goto fail_open2 if $closeto; + close(FROM) || goto fail_open1 if $closefrom; + $\ = $recsep; + return 1; + + # All of these contortions try to preserve error messages... + fail_inner: + if ($closeto) { + $status = $!; + $! = 0; + close TO; + $! = $status unless $!; + } + fail_open2: + if ($closefrom) { + $status = $!; + $! = 0; + close FROM; + $! = $status unless $!; + } + fail_open1: + $\ = $recsep; + return 0; +} +*cp = \© + +1; + +__END__ +=head1 NAME + +File::Copy - Copy files or filehandles + +=head1 USAGE + + use File::Copy; + + copy("file1","file2"); + copy("Copy.pm",\*STDOUT);' + + use POSIX; + use File::Copy cp; + + $n=FileHandle->new("/dev/null","r"); + cp($n,"x");' + +=head1 DESCRIPTION + +The Copy module provides one function (copy) which takes two +parameters: a file to copy from and a file to copy to. Either +argument may be a string, a FileHandle reference or a FileHandle +glob. Obviously, if the first argument is a filehandle of some +sort, it will be read from, and if it is a file I it will +be opened for reading. Likewise, the second argument will be +written to (and created if need be). + +An optional third parameter can be used to specify the buffer +size used for copying. This is the number of bytes from the +first file, that wil be held in memory at any given time, before +being written to the second file. The default buffer size depends +upon the file, but will generally be the whole file (up to 2Mb), or +1k for filehandles that do not reference files (eg. sockets). + +You may use the syntax C to get at the +"cp" alias for this function. The syntax is I the same. + +=head1 RETURN + +Returns 1 on success, 0 on failure. $! will be set if an error was +encountered. + +=head1 AUTHOR + +File::Copy was written by Aaron Sherman in 1995. + +=cut