[Chicago-talk] Net::FTP

Steven Lembark lembark at wrkhors.com
Tue Dec 23 14:21:35 CST 2003

-- "Dooley, Michael" <Dooley.Michael at con-way.com>

> is there a way to pull a unique filename from the Net::FTP package?
> something like $ftp->unique_name(); unfortunately this works on the server
> side not the client side or do I have to do something like below?
> my @local_files=glob("*"); ## assume you are in the proper directory
> if (grep $ftp_file eq $_, @local_files) {
> $ftp->get("$ftp_file",$ftp_file.$randnum);
> } else {
> $ftp->get("$ftp_file");
> }

File::Temp will give you the ability to load a file into
the local system, validate it, and then overwrite the existing
file if you like.

tempfile returns a file handle and path, and $ftp->get takes a
file handle (nice way to unzip things on the fly also):

	sub ftp_get
		my $ftp = shift or die "Bogus ftp_get: missing ftp";
		my $remote = shift or die "Bogus ftp_get: missing remote";

		my $local = basename $remote;

		my( $fh, $path ) = tempfile( "$local-XXXX" );

		# double-check me that this returns zero...

		if( $ftp->get($remote, $fh) )
			# blew it... assume caller uses exceptions.
			# see attached for boilerplate...
			die "Failed $remote: $errorstring";
			rename $path, $remote or die "$path -> $remote: $!";

		# no return, caller is happy enough just to be alive.

The attached files are part of wormbase and use Schedule:Depend
to dispatch the operation. Wormbase::Download does the deed.
The $config argument is -- as you might guess -- a hash referent
w/ named parameters. This generates a queue of items to be downloaded
from the remote system and downloads the new files (i.e., ones not
found on the local system).

One cute trick is opening a gzip | cpio pipe in order to extract
tarballs on the fly as they are downloaded.

Steven Lembark                               2930 W. Palmer
Workhorse Computing                       Chicago, IL 60647
                                            +1 888 359 3508
-------------- next part --------------
#!/usr/local/bin/perl -w

package Wormbase;

use strict;

use FindBin qw( $Bin );
BEGIN { use lib "$Bin" }

use Wormbase::Execute;

runsched ( 'download :', 'download' );

# this isn't a module


-------------- next part --------------
A non-text attachment was scrubbed...
Name: Download.pm
Type: application/x-perl
Size: 20669 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/chicago-talk/attachments/20031223/117adf85/Download.bin

More information about the Chicago-talk mailing list