TDJの隠れ家♪ トップ>HSP >Scripts>FTP

FTP

FronTier.hsp
ソースのダウンロード

#include "hspinet.as"
#include "hspda.as"
#define Title_name "FronTier (Provisional) Ver.0.10"

とりあえず定義です。
HSPDAはCSVをいじるときに必要になります。
HSPINETはFTP接続に必要です。
その次の行はタイトルです。本文に書くと長くなるので、ちょっとここに退避させておきます。

#uselib "shell32.dll"
#func DragAcceptFiles "DragAcceptFiles" int,int
#func DragQueryFile "DragQueryFileA" int,int,int,int
#func DragQueryPoint "DragQueryPoint" int,int
#func DragFinish "DragFinish" int
#define WM_DROPFILES 0x0233

これはドラッグ・アンド・ドロップ対応アップロードに必要です。
特に重要ではないので無視してかまいません。(著者もあまり正確には理解していません(笑))

screen 0,300,210,0,(ginfo_dispx-550)/2+20,(ginfo_dispy-350)/2+20
title Title_name+" 接続先指定"
server_ad=str(server_ad) : server_ad=""
user_name=str(user_name) : user_name=""
login_ps=str(login_ps) : login_ps=""
data=str(data) : check_file=str(check_file)
sdim local_dir,64 : local_dir=dir_cur
notesel ex_data
exist "ex.dat" : if strsize=-1 : ex_data=".htm\n.txt\n.cgi\n.css\n.php\n.log\n.csv\n.ini\n.pas\n.c\n.h\n.pl\n.html\n.php3" : notesave "ex.dat"
noteload "ex.dat"

いろいろな変数の用意です。
"exist"は"ex.dat"があるかどうか確認して、なければ作ります。
"ex.dat"はアスキーモードで送信するファイルの拡張子が記載されています。

onerror gosub *notfind_err : onerror 0
onexit goto *end_dlg : onexit 0

割り込み用のサブルーチンを設定しておきます。
今はいらないのでオフにします。

;接続
*input_log
  cls 1 : mes "サーバーアドレス" : input server_ad,120
  mes "ログインユーザー名" : input user_name,120
  mes "ログインパスワード" : input login_ps,120
  exist "data.net" : if strsize!-1 : button "前回入力",*data_load
  button "接続",*online : button "閉じる",*close : stop

接続設定画面を用意します。
セーブデータがあれば前回入力ボタンを表示します。

*online
  screen 0,550,350,0,(ginfo_dispx-550)/2,(ginfo_dispy-350)/2
  cls 1 : title Title_name
  netinit : if stat : goto *err_dlg
  ftpopen server_ad,user_name,login_ps : if stat!0 : goto *err_dlg
  onexit 1 : gosub *list_get : goto *draw

FTP接続を開始します。
"onexit"をここで発動しておきます。

;リスト受信
*dir_get
  sdim dir_list,64 : dirlist dir_list,"*.*",5 : dirlist dir_list2,"*.*",1 : return

ディレクトリのリストを取ります。

*list_get
  sdim ftp_list,64 : dim res,1
  gosub *dir_get
  ftpdirlist : if stat : goto *err_dlg
  repeat
    netexec res : if res : break
  await 100 : loop
  if res<0 : goto *err_dlg
  ftpdirlist2 ftp_list : return

FTP側のディレクトリを調べます。
何らかのエラーが出てくればエラーを出します。

;描画
*draw
  cls 1
  pos 0,0 : button "切断",*end_dlg : dir_name=dir_cur : mesbox dir_name,200,30,0
  pos 70,0 : button gosub "更新",*list_get
  pos 0,60 : objsize 200 : listbox choice_dir,100,dir_list
  pos 0,170 : listbox choice_file,100,dir_list2
  pos 0,280 : button "1つ上の階層へ",*dir_up
  pos 0,310 : button "選択した階層へ",*dir_down
  pos 300,60 : listbox choice_ftp,200,ftp_list
  objsize 50 : pos 220,130 : button "→",*file_up
  pos 220,160 : button "←",*file_down
  objsize 70 : pos 210,30 : combox choice_mode,100,"バイナリ\nアスキー\n自動"
  objsize 100 : pos 150,0 : button "アップロード専用",*up_only
  stop

アップロード画面を表示します。
これを基本画面とします。

;送受信
*file_up
  notesel dir_list2 : noteget up_file,choice_file : check_file=up_file
  gosub *check_mode : ftpput up_file,,mode : if stat : gosub *up_err_dlg
  gosub *list_get : goto *draw

アップロードです。

*file_down
  sdim ftp_file,64 : sdim ftp_file2,64 : sdim down_file,64 : dim down_file_long,1
  notesel ftp_list : noteget ftp_file,choice_ftp
  csvnote ftp_file2,ftp_file
  notesel ftp_file2 : noteget down_file,0
  down_file_long=strlen(down_file) : down_file=strmid(down_file,1,down_file_long-2)
  check_file=down_file : gosub *check_mode
  ftpget down_file,,mode : if stat : gosub *down_err_dlg
  if stat=6 : gosub *list_get : goto *file_down
  gosub *list_get : goto *draw

ダウンロードです。
入り組んだ構造になっています。

;転送方式
*check_mode
  mode=choice_mode : if mode=2 : gosub *check_mode_auto
  return

転送方式です。
こちらは手動です。

*check_mode_auto
  check_file_ex=getpath(check_file,2) : notesel ex_data : mode=0
  repeat notemax
    noteget ex_data2,cnt : if check_file_ex=ex_data2 : mode=1 : break
  loop : return

こちらは自動です。
転送方式にはバイナリとアスキーがあるので、これを調整します。
基本はバイナリですが、"ex.dat"に載っているものはアスキーにします。

;データセーブロード
*data_save
  sdim data,64 : notesel data
  noteadd server_ad,0 : noteadd user_name,1 : noteadd login_ps,2
  choice_mode=str(choice_mode) : noteadd choice_mode,3 : choice_mode=int(choice_mode)
  dir_name=dir_cur : noteadd dir_name,4
  chdir local_dir : notesave "data.net" : chdir dir_name
  return
*data_load
  cls 1 : sdim data,64 : notesel data : noteload "data.net"
  noteget server_ad,0 : noteget user_name,1 : noteget login_ps,2
  noteget choice_mode,3 : choice_mode=int(choice_mode)
  noteget dir_name,4 : chdir dir_name
  goto *input_log

データセーブロードです。
ブラックボックスにしておいてもかまいません。

;ディレクトリ移動
*dir_up
  chdir "..\\" : gosub *dir_get : goto *draw
*dir_down
  notesel dir_list : noteget down_dir,choice_dir
  onerror 1 : chdir down_dir : onerror 0 : gosub *dir_get : goto *draw

ディレクトリ移動です。
"chdir"を用います。

;エラーメッセージ
*err_dlg
  ftpclose : dialog "接続に失敗しました。",1 : end
*up_err_dlg
  dialog "送信に失敗しました。",1 : return
*up_fin_dlg
  dialog "送信に成功しました",0 : return
*down_err_dlg
  dialog "受信に失敗しました。再試行しますか?",3 : return
*end_dlg
  ftpclose : gosub *data_save : dialog "接続は正常に終了しました。",0 : end
*close
  end
*notfind_err
  dialog "指定されたディレクトリが見つかりません",1 : return

エラー各種です。
ダイアログメッセージが出ます。

;送信専用
*up_only
  ;screen 0,200,200,0,(ginfo_dispx-100)/2+100,(ginfo_dispy-100)/2 : cls
  title "MINI "+Title_name
  picload "point.gif",0
  objsize 30 : pos 0,0 : button "選択",*o_choice_file
  pos 33,0 : button "戻る",*back
  pos 66,0 : button "終了",*end_dlg
  oncmd gosub *drop_file,WM_DROPFILES
  DragAcceptFiles hwnd,1 : stop
*o_choice_file
  dialog "*",16,"全てのファイル" : if stat!1 : stop
  check_file_path=refstr : check_file_dir=getpath(check_file_path,32)
  chdir check_file_dir
  check_file=getpath(check_file_path,8)
  gosub *check_mode_auto : ftpput check_file,,mode : if stat : gosub *up_err_dlg
  chdir local_dir : stop
*drop_file
  hdrop=wParam : DragQueryFile hdrop,-1,0,0 : ndrop=stat : sdim file_name,260
  repeat ndrop
    DragQueryFile hdrop,cnt,varptr(file_name),260
    file_name2=getpath(file_name,32) : chdir file_name2
    check_file=getpath(file_name,8)
    gosub *check_mode_auto : ftpput check_file,,mode
  loop
  if stat : gosub *up_err_dlg : else : gosub *up_fin_dlg
  DragFinish hdrop : chdir local_dir : return
*back
  screen 0,550,350,0,(ginfo_dispx-550)/2,(ginfo_dispy-350)/2
  cls 1 : title Title_name : oncmd 0
  gosub *list_get : goto *draw

以上は本体とほぼ変わりません。
違うのはドラッグ・アンド・ドロップ用機能がついていることです。

以上で全てです。
改善できる部分はいろいろあります。
FTP側のファイルサイズなどを分割して表示した方が見やすいでしょう。
それには少しHSPDA系命令を加えればいいです。