hi

I have a ftp script that i have been testing on my own machine. It works
when i try it on my ftp server on my computer, but it does not work when on
any server that is not mine.

I feel it is the $ftp->size() that does not register when i logon to a
remote site whether it be a microsoft, freebsd or linux server.....it gives
me no value for the size of the given file...without this i cannot
download, as i have setup my transfers not using the get() command, but
using the $ftp->retr for the purpose of displaying the gui progress bar of
the transfer.


try the attached script....just run it, it will log you on to anomynously
to ftp.microsoft.com and attempt to download a file.

it will display debugging messages such as "cannot get filesize "
use Win32::GUI;
use Win32::API;
use Win32;
use Net::FTP;
use Cwd;



[EMAIL PROTECTED] = file,                                                       
0 
#                               mode (send/recieve),1 
#                               mode (ascii/binary),2 
#                               ftphost,            3
#                               user,               4
#                               pass,               5
#                               port,               6
#                               passive (y/n)       7
#       CWD                 8
#
#
#

#if (@ARGV) {
TransferSetup();
#}else {
#       print "***Error: Not a StandAlone program\n"; 
#       sleep 1;
#}


sub TransferSetup() {
        my $file = 'macosplayer3.1b1c7.hqx'; # the file to recieve
        my $SendRecieveMode = 'recieve'; # which way is the transfer
        my $TransferMode = 'asc'; # binary or ascii
        my $FtpHost = 'ftp.microsoft.com'; # hostname
        my $UserName = 'anonymous'; #user
        my $Pass = '[EMAIL PROTECTED]'; #pass
        my $Port = '21'; #port
        my $Passive = '0'; # 0 for nonpassive, 1 for passive
        my $CWD = 'D:\backup\perl stuff\perltidy-20010304\perltidy-20010304\\';
        
                 $ftp = Net::FTP->new($FtpHost, Timeout => 60, Passive => 1) || 
exit;
                 $ftp->login("$UserName","$Pass") || die "cant login";
                 $ftp->port($Port);
                 
                 if ( $TransferMode eq "bin" ) {
                        $ftp->type(binary());           
                 }
                 
                 if ($SendRecieveMode eq "recieve") {
                                &RecieveTransfer($file,$CWD,$TransferMode);
                        }
                        else {
                                die;
                        }
                 
}


sub RecieveTransfer {
    my $RemoteFile = $_[0];
    print "$RemoteFile\n";
    my $buffer='';
    my $size = $ftp->size($RemoteFile) || print "cannot get file size!";
    CreateProgressWin();
    Win32::GUI::DoEvents();
    my $blksize = 10240;
    my $track = 0;
    my $pos = 0;
    my $CurrentLocalDir = $_[1];
    my $TransferMode = $_[2]; 
    $blksize = 6240 if ( $size >= 300000 );
    $TransferBox->Label_1->Text("$RemoteFile");
    $TransferBox->Status->Text("Retrieving $RemoteFile...");
    $TransferBox->TransferProgressBar_1->SetRange(0, 100);
    $TransferBox->TransferProgressBar_1->SetPos(0);
    $TransferBox->Size->Text("$track bytes of $size bytes");
    $TransferBox->Progress->Text(int($pos)."%");
    $TransferBox->Show();
    if ( TransferMode eq 'asc' ) {
        if (!open ( FILE, "> $CurrentLocalDir"."/".$RemoteFile )) {
            Msg_Box("Can't create a file to put the data for $RemoteFile: 
$!.",48,"Can't Create File");
            return 0;
        }
    } else {
        if (!open ( FILE, "> $CurrentLocalDir"."/".$RemoteFile )) {
            Msg_Box("Can't create a file to put the data for $RemoteFile: 
$!.",48,"Can't Create File");
            return 0;
        }
        binmode FILE;
    }
    if (! ($data = $ftp->retr($RemoteFile)) ) {
        Msg_Box("Can't open a data retrieval socket for $RemoteFile.",48,"Can't 
Open Socket");
        return 0;
    }
    while() {
        last if Win32::GUI::DoEvents() < 0;
        $TransferBox->Size->Text("$track bytes of $size bytes");
        $percent = $track/$size;
        $pos = 100*$percent;
        $TransferBox->Progress->Text(int($pos)."%");
        $TransferBox->TransferProgressBar_1->SetPos($pos);
        $TransferBox->DoEvents();
        last unless $len = $data->read($buffer,$blksize);
        $track += $len;
        my $written = syswrite(FILE, $buffer, $len);
        $TransferBox->Show();
        unless(defined($written) && $written == $len) {
            Msg_Box("Cannot write to local file 
$CurrentLocalDir.\\.$RemoteFile: $!",48,"Can't Write To File");
            $data->abort;
            $TransferBox->Hide();
            close(FILE);
            return undef;
        }
    }
    $TransferBox->Hide();
    Win32::GUI::DoEvents();
    close(FILE);
    $data->close(); # implied $ftp->response
    return 1;
}


sub Msg_Box ($$$) {
    my ($msg, $buttons, $title) = (shift, shift, shift);
    return Win32::MsgBox($msg, $buttons, $title);
}


sub CreateProgressWin {
$TransferBox = new Win32::GUI::Window(
      -left   => 670,
      -top    => 264,
      -width  => 392,
      -height => 141,
      -name   => "TransferBox",
      -text   => "File Transfer"
      );

$TransferBox->Show();

$TransferBox->AddProgressBar(
       -text    => "Transfer Progress",
       -name    => "TransferProgressBar_1",
       -left    => 13,
       -top     => 53,
       -width   => 356,
       -height  => 12,
      );

$TransferBox->AddButton(
       -text    => "",
       -name    => "GroupBox_1",
       -left    => 3,
       -top     => 3,
       -width   => 375,
       -height  => 87,
       -style  => WS_CHILD | WS_VISIBLE | 7,  # GroupBox
      );

$TransferBox->AddButton(
       -text    => "Kill",
       -name    => "Cancel",
       -left    => 352,
       -top     => 93,
       -width   => 29,
       -height  => 21,
       -foreground    => 16744448,
      );

$TransferBox->AddLabel(
       -text    => "File :",
       -name    => "Label_1",
       -left    => 10,
       -top     => 13,
       -width   => 200,
       -height  => 13,
       -foreground    => 0,
      );

$TransferBox->AddLabel(
       -text    => "Size (Bytes):",
       -name    => "Size",
       -left    => 11,
       -top     => 31,
       -width   => 200,
       -height  => 13,
       -foreground    => 0,
      );

$TransferBox->AddLabel(
       -text    => "Progress (%) :",
       -name    => "Progress",
       -left    => 166,
       -top     => 70,
       -width   => 89,
       -height  => 13,
       -foreground    => 0,
      );

#$TransferBox->AddStatusBar(
#       -text    => "Transfer Status:",
#       -name    => "StatusBar_1",
#       -left    => 0,
#       -top     => 799,
#       -width   => 1150,
#       -height  => 17,
#      );

$TransferBox->AddButton(
       -text    => "",
       -name    => "transferStatus",
       -left    => 5,
       -top     => 88,
       -width   => 339,
       -height  => 24,
       -style  => WS_CHILD | WS_VISIBLE | 7,  # GroupBox
      );

$TransferBox->AddLabel(
       -text    => "Transfer Status :",
       -name    => "Status",
       -left    => 11,
       -top     => 96,
       -width   => 250,
       -height  => 13,
       -foreground    => 0,
      );

#Win32::GUI::Dialog();
#return 1;

}

Win32::GUI::Dialog();
sub MainWindow_Terminate {
    return -1;
}

#Win32::GUI::Dialog();
sub Cancel_Click {
        return -1;
        #exit;
}



Reply via email to