FTP
ソースのダウンロード
#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
"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
何らかのエラーが出てくればエラーを出します。
;描画
*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系命令を加えればいいです。