# 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