#!D:/Perl/bin/perl.exe # FTPクライアントPerlスクリプトその2(Windowsサーバー専用BASP21版) # BASPftp2.pl 2002.08.21 作成:鷹の巣 http://sakaguch.com/ # # FTPサーバーから、ファイルをダウンロードし、処理して、アップロードする。 # # BASP21.DLLの入手先は、http://www.hi-ho.ne.jp/babaq/basp21.html # 参考Webは、BASP21 FTPオブジェクト # http://www.hi-ho.ne.jp/babaq/basp21f.html #■□■ FTPサーバーの設定 ■□■ $FTPserver = 'example.com'; # FTPサーバーのホスト名。 $FTPuser = 'userID'; # FTP接続のユーザ名。 $FTPpass = 'password'; # FTP接続のパスワード。 $FTPtimeout = 60; # FTP接続待ち許容時間(秒) # FTPサーバーのディレクトリとファイル名の設定 $FTPremotedir = '/public_html'; # FTPサーバーに接続した後、change-directoryする場所 $FTPlocaldir = 'c:\temp'; # FTPクライアントのローカルフォルダ名 $FTPrfile = 'remote.txt'; # FTPサーバーのファイル名 $FTPlfile = 'local.txt'; # FTPクライアントのファイル名は、FTPサーバーのファイル名と同じにする。 $FTPremotefile = $FTPremotedir."/".$FTPrfile; # FTPサーバーのフルパスのファイル名 $FTPlocalfile = $FTPlocaldir."\\".$FTPlfile; # FTPクライアントのフルパスのファイル名 #■□■ FTPサーバー関係の設定終わり ■□■ use Win32::OLE; # OLEパッケージの使用 &main(); exit; sub main{ $FTP = Win32::OLE -> new('basp21.FTP'); # Basp21オブジェクトの作成と変数の確保 $ftp_res = $FTP -> Connect($FTPserver.':21:'.$FTPtimeout,$FTPuser,$FTPpass);# $ftp_res=0:接続OK。 if (!$ftp_res) { # FTPサーバーからファイルを受信。$ftp_resが1以上で正常終了。 $ftp_res = $FTP -> GetFile($FTPremotefile,$FTPlocaldir,0); if ($ftp_res < 0) {&FTPerr_retry("初回get失敗($ftp_res)");} # ファイル受信の再試 print "ダウンロードに成功しました。\n"; # &XXXXX($FTPlocalfile); # ファイルの内容に対して何か処理する。 # FTPサーバーへファイルを送信。$ftp_resが1以上で正常終了。 $ftp_res = $FTP -> PutFile($FTPlocalfile,$FTPremotedir,0); if ($ftp_res < 0) {&FTPerr_retry("初回put失敗($ftp_res)");} # ファイル送信の再試 print "アップロードに成功しました。\n"; $FTP -> Close; # FTP切断 } } #--------------------------------------- # エラー時の再試(無限回) #--------------------------------------- sub FTPerr_retry { my $err_message = $_[0]; # 引数0:エラーメッセージ worn($err_message); my $ftp_res; my $retry_count = 0; # 再試回数の初期化 for (;;){ # 無限ループ $retry_count++; $FTP -> Close; # FTP切断 sleep (60); # 処理の休止時間(★要調整★) $ftp_res = $FTP -> Connect($FTPserver.':21:'.$FTPtimeout,$FTPuser,$FTPpass);# $ftp_res=0:接続OK。 if (!$ftp_res) { if ($err_message =~ /^get/) { # FTPサーバーからファイルを受信。$ftp_resが1以上で正常終了。 $ftp_res = $FTP->GetFile($FTPremotefile,$FTPlocaldir,0); if ($ftp_res < 1) {warn("再試$retry_count回get失敗($ftp_res)"); next; } else { last; } } if ($err_message =~ /^put/) { # FTPサーバーへファイルを送信。$ftp_resが1以上で正常終了。 $ftp_res = $FTP->PutFile($FTPlocalfile,$FTPremotedir,0); if ($ftp_res < 1) {warn("再試$retry_count回put失敗($ftp_res)"); next; } else { last; } } } } }