;============================================================ ; iron_ftp.hsp — FTP クライアントモジュール ; ; WinINet API を使用。FTP / FTPS (Explicit TLS) 対応。 ; ; API: ; ftp_connect "host", "user", "pass" [, port] 接続 → stat (0=成功) ; ftp_disconnect 切断 ; ftp_upload "local_file", "remote_file" アップロード → stat ; ftp_download "remote_file", "local_file" ダウンロード → stat ; ftp_delete "remote_file" 削除 → stat ; ftp_rename "old", "new" リネーム → stat ; ftp_mkdir "dir" ディレクトリ作成 → stat ; ftp_rmdir "dir" ディレクトリ削除 → stat ; ftp_cd "dir" ディレクトリ移動 → stat ; ftp_pwd カレントディレクトリ → refstr ; ftp_list "pattern" ファイル一覧 → refstr (改行区切り) ; ; 例: ; #include "iron_ftp.hsp" ; ftp_connect "ftp.example.com", "user", "pass" ; if stat == 0 { ; ftp_upload "local.txt", "remote.txt" ; ftp_list "*" ; mes refstr ; ftp_disconnect ; } ;============================================================ #ifndef __iron_ftp_hsp__ #define __iron_ftp_hsp__ #module iron_ftp #uselib "wininet.dll" #cfunc _InternetOpenA "InternetOpenW" wstr, int, int, int, int #cfunc _InternetConnectA "InternetConnectW" int, wstr, int, wstr, wstr, int, int, int #cfunc _InternetCloseHandle "InternetCloseHandle" int #cfunc _FtpPutFileA "FtpPutFileW" int, wstr, wstr, int, int #cfunc _FtpGetFileA "FtpGetFileW" int, wstr, wstr, int, int, int, int #cfunc _FtpDeleteFileA "FtpDeleteFileW" int, wstr #cfunc _FtpRenameFileA "FtpRenameFileW" int, wstr, wstr #cfunc _FtpCreateDirectoryA "FtpCreateDirectoryW" int, wstr #cfunc _FtpRemoveDirectoryA "FtpRemoveDirectoryW" int, wstr #cfunc _FtpSetCurrentDirectoryA "FtpSetCurrentDirectoryW" int, wstr #cfunc _FtpGetCurrentDirectoryA "FtpGetCurrentDirectoryW" int, var, var #cfunc _FtpFindFirstFileA "FtpFindFirstFileW" int, wstr, var, int, int #cfunc _InternetFindNextFileA "InternetFindNextFileW" int, var #uselib "kernel32.dll" #cfunc _WC2MB_ftp "WideCharToMultiByte" int, int, var, int, var, int, int, int ; INTERNET_SERVICE_FTP = 1 ; FTP_TRANSFER_TYPE_BINARY = 2 ; INTERNET_FLAG_PASSIVE = 0x08000000 ; INTERNET_OPEN_TYPE_PRECONFIG = 0 dim _hInet, 1 dim _hFtp, 1 #deffunc ftp_connect str host, str user, str pass, int port_, \ local p p = port_ : if p <= 0 : p = 21 _hInet = _InternetOpenA("IronHSP/1.0", 0, 0, 0, 0) if _hInet == 0 : return -1 ; INTERNET_FLAG_PASSIVE = 0x08000000 _hFtp = _InternetConnectA(_hInet, host, p, user, pass, 1, 0x08000000, 0) if _hFtp == 0 { _InternetCloseHandle _hInet : _hInet = 0 return -2 } return 0 #deffunc ftp_disconnect if _hFtp != 0 : _InternetCloseHandle _hFtp : _hFtp = 0 if _hInet != 0 : _InternetCloseHandle _hInet : _hInet = 0 return #deffunc ftp_upload str local_file, str remote_file if _hFtp == 0 : return -1 ; FTP_TRANSFER_TYPE_BINARY = 2 return 1 - _FtpPutFileA(_hFtp, local_file, remote_file, 2, 0) #deffunc ftp_download str remote_file, str local_file if _hFtp == 0 : return -1 return 1 - _FtpGetFileA(_hFtp, remote_file, local_file, 0, 0, 2, 0) #deffunc ftp_delete str remote_file if _hFtp == 0 : return -1 return 1 - _FtpDeleteFileA(_hFtp, remote_file) #deffunc ftp_rename str old_name, str new_name if _hFtp == 0 : return -1 return 1 - _FtpRenameFileA(_hFtp, old_name, new_name) #deffunc ftp_mkdir str dir if _hFtp == 0 : return -1 return 1 - _FtpCreateDirectoryA(_hFtp, dir) #deffunc ftp_rmdir str dir if _hFtp == 0 : return -1 return 1 - _FtpRemoveDirectoryA(_hFtp, dir) #deffunc ftp_cd str dir if _hFtp == 0 : return -1 return 1 - _FtpSetCurrentDirectoryA(_hFtp, dir) #deffunc ftp_pwd local wbuf, local bsz, local ubuf if _hFtp == 0 : return "" bsz = 520 sdim wbuf, bsz _r = _FtpGetCurrentDirectoryA(_hFtp, wbuf, bsz) sdim ubuf, 520 _r = _WC2MB_ftp(65001, 0, wbuf, -1, ubuf, 520, 0, 0) return ubuf #deffunc ftp_list str pattern, \ local _fd_f, local _hf_f, local _res_f, local _wn_f, local _fn_f, local _cvr_f if _hFtp == 0 : return "" ; WIN32_FIND_DATAW = 624 bytes, cFileName at offset 44, 260 wchars = 520 bytes sdim _fd_f, 624 _hf_f = _FtpFindFirstFileA(_hFtp, pattern, _fd_f, 0, 0) if _hf_f == 0 : return "" _res_f = "" repeat sdim _wn_f, 520 memcpy _wn_f, _fd_f, 520, 0, 44 sdim _fn_f, 520 _cvr_f = _WC2MB_ftp(65001, 0, _wn_f, -1, _fn_f, 520, 0, 0) if _res_f != "" : _res_f += "\n" _res_f += _fn_f sdim _fd_f, 624 if _InternetFindNextFileA(_hf_f, _fd_f) == 0 : break loop _r = _InternetCloseHandle(_hf_f) return _res_f #global #endif