Visual Basic6 リファレンス
|
VB6 FTP操作 (API)
API(WinInet.DLL)を使ったFTP接続・操作 |
WinInet API ソースはVB6用で記述しています。VB.NET以降のバージョンは型宣言に注意してください (VB6:Long → VB.NET以降:Integer) (VB6:Integer → VB.NET以降:Short) |
お品書き |
● 標準モジュール | API定義 標準モジュール |
● サンプル プログラム | テキストファイルをダウンロードするサンプル プログラム |
● サンプル プログラム | テキストファイルをアップロードするサンプル プログラム |
● サンプル プログラム | 指定ディレクトリのファイル一覧を取得するサンプル プログラム |
● InternetOpen | インターネットサービスのオープン |
● InternetConnect | FTPサーバへ接続 |
● InternetCloseHandle | インターネットサービスのクローズ |
● FtpGetCurrentDirectory | FTPサーバのカレントディレクトリを取得 |
● FtpSetCurrentDirectory | FTPサーバのカレントディレクトリを変更 |
● FtpGetFile | FTPサーバからファイルを取得 |
● FtpPutFile | FTPサーバへファイルを転送 |
● FtpDeleteFile | FTPサーバのファイルを削除 |
● FtpRenameFile | FTPサーバのファイル名を変更 |
● FtpRemoveDirectory | FTPサーバのディレクトリを削除 |
● 標準モジュール(エラー定数) | API定義 標準モジュール(エラー定数) |
● API定義 標準モジュール ' Constants - InternetOpen.lAccessType Public Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0& Public Const INTERNET_OPEN_TYPE_DIRECT As Long = 1& Public Const INTERNET_OPEN_TYPE_PROXY As Long = 3& Public Const INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY As Long = 4& ' Constants - InternetOpen.dwFlags Public Const INTERNET_FLAG_ASYNC As Long = &H10000000 Public Const INTERNET_FLAG_FROM_CACHE As Long = &H1000000 Public Const INTERNET_FLAG_OFFLINE As Long = INTERNET_FLAG_FROM_CACHE ' Constants - InternetConnect.nServerPort Public Const INTERNET_INVALID_PORT_NUMBER As Long = 0& Public Const INTERNET_DEFAULT_FTP_PORT As Long = 21& Public Const INTERNET_DEFAULT_GOPHER_PORT As Long = 70& Public Const INTERNET_DEFAULT_HTTP_PORT As Long = 80& Public Const INTERNET_DEFAULT_HTTPS_PORT As Long = 443& Public Const INTERNET_DEFAULT_SOCKS_PORT As Long = 1080& ' Constants - InternetConnect.dwService Public Const INTERNET_SERVICE_FTP As Long = 1& Public Const INTERNET_SERVICE_GOPHER As Long = 2& Public Const INTERNET_SERVICE_HTTP As Long = 3& ' Constants - InternetConnect.dwFlags Public Const INTERNET_FLAG_PASSIVE As Long = &H8000000 ' Constants - FtpGetFile.dwFlags (FTP TransferType) ' Constants - FtpPutFile.dwFlags (FTP TransferType) Public Const FTP_TRANSFER_TYPE_UNKNOWN As Long = &H0& Public Const FTP_TRANSFER_TYPE_ASCII As Long = &H1& Public Const FTP_TRANSFER_TYPE_BINARY As Long = &H2& Public Const INTERNET_FLAG_TRANSFER_ASCII As Long = FTP_TRANSFER_TYPE_ASCII Public Const INTERNET_FLAG_TRANSFER_BINARY As Long = FTP_TRANSFER_TYPE_BINARY ' Constants - FtpGetFile.dwFlags (Cache Flags) ' Constants - FtpPutFile.dwFlags (Cache Flags) Public Const INTERNET_FLAG_RELOAD As Long = &H80000000 Public Const INTERNET_FLAG_RESYNCHRONIZE As Long = &H800 Public Const INTERNET_FLAG_NEED_FILE As Long = &H10 Public Const INTERNET_FLAG_HYPERLINK As Long = &H400 ' Constants - FtpGetFile.dwFlagsAndAttributes Public Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20 Public Const FILE_ATTRIBUTE_ENCRYPTED As Long = &H4000 Public Const FILE_ATTRIBUTE_HIDDEN As Long = &H2 Public Const FILE_ATTRIBUTE_NORMAL As Long = &H80 Public Const FILE_ATTRIBUTE_OFFLINE As Long = &H1000 Public Const FILE_ATTRIBUTE_READONLY As Long = &H1 Public Const FILE_ATTRIBUTE_SYSTEM As Long = &H4 Public Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100 Public Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10 Public Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800 '============ ' FILETIME 構造体 '============ Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type '================== ' WIN32_FIND_DATA 構造体 '================== Public Const MAX_PATH = 260 Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type '======================== ' インターネットハンドルを取得します。 '======================== Public Declare Function InternetOpen Lib "WININET.DLL" Alias "InternetOpenA" _ (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, _ ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long '============= ' サーバへ接続します。 '============= Public Declare Function InternetConnect Lib "WININET.DLL" Alias "InternetConnectA" _ (ByVal HINTERNET As Long, ByVal lpszServerName As String, ByVal nServerPort As Integer, _ ByVal lpszUsername As String, ByVal lpszPassword As String, ByVal dwService As Long, _ ByVal dwFlags As Long, ByVal dwContext As Long) As Long '====================== ' インターネットハンドルを閉じます。 '====================== Public Declare Function InternetCloseHandle Lib "WININET.DLL" _ (ByVal HINTERNET As Long) As Integer '============================ ' サーバのカレントディレクトリを取得します。 '============================ Public Declare Function FtpGetCurrentDirectory Lib "WININET.DLL" Alias "FtpGetCurrentDirectoryA" _ (ByVal hConnect As Long, ByVal lpszCurrentDirectory As String, _ ByRef lpdwCurrentDirectory As Long) As Boolean '============================ ' サーバのカレントディレクトリを設定します。 '============================ Public Declare Function FtpSetCurrentDirectory Lib "WININET.DLL" Alias "FtpSetCurrentDirectoryA" _ (ByVal hConnect As Long, ByVal lpszDirectory As String) As Long '===================== ' サーバからファイルを取得します。 '===================== Public Declare Function FtpGetFile Lib "WININET.DLL" Alias "FtpGetFileA" _ (ByVal hConnect As Long, ByVal lpszRemoteFile As String, _ ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, _ ByVal dwFlags As Long, ByVal dwContext As Long) As Long '=================== ' サーバへファイルを転送します。 '=================== Public Declare Function FtpPutFile Lib "WININET.DLL" Alias "FtpPutFileA" _ (ByVal hConnect As Long, ByVal lpszLocalFile As String, _ ByVal lpszNewRemoteFile As String, _ ByVal dwFlags As Long, ByVal dwContext As Long) As Long '==================== ' サーバのファイルを削除します。 '==================== Public Declare Function FtpDeleteFile Lib "WININET.DLL" Alias "FtpDeleteFileA" _ (ByVal hConnect As Long, ByVal lpszFileName As String) As Long '===================== ' サーバのファイル名を変更します。 '===================== Public Declare Function FtpRenameFile Lib "WININET.DLL" Alias "FtpRenameFileA" _ (ByVal hConnect As Long, ByVal lpszExisting As String, ByVal lpszNew As String) As Long '====================== ' サーバのディレクトリを削除します。 '====================== Public Declare Function FtpRemoveDirectory Lib "WININET.DLL" Alias "FtpRemoveDirectoryA" _ (ByVal hConnect As Long, ByVal lpszDirectory As String) As Long '======================== ' 指定されたディレクトリを検索します。 '======================== Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _ (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _ lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long '======================== ' 引き続き、ディレクトリを検索します。 '======================== Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _ (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long |
● テキストファイルをダウンロードするサンプル プログラム '=========================== ' FTPでテキストファイルをダウンロードする '=========================== Private Sub Sample() Dim hOpen As Long 'インターネットサービスのハンドル Dim hConnection As Long 'インターネットセッションのハンドル Dim result As Long hOpen = 0 hConnection = 0 'インターネットサービスのハンドル取得 - hOpen hOpen = InternetOpen("FTPSample", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) If (hOpen <> 0) Then 'ハンドル取得成功 'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection hConnection = InternetConnect(hOpen, "HogeSvr", INTERNET_INVALID_PORT_NUMBER, _ "HogeUsr", "HogePwd", INTERNET_SERVICE_FTP, 0, 0) If (hConnection <> 0) Then '接続成功 'FTPサーバのカレントディレクトリを変更 result = FtpSetCurrentDirectory(hConnection, "/export/home/tatsuya") If (result <> 0) Then 'ディレクトリ変更成功 'ファイルをダウンロード result = FtpGetFile(hConnection, "sample.txt", "c:¥test¥sample.txt", False, _ FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII Or INTERNET_FLAG_RELOAD, 0) If (result = 0) Then 'ダウンロード失敗 MsgBox "ファイルの取得に失敗しました。" & Err.LastDllError End If Else MsgBox "ディレクトリの移動に失敗しました。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If 'インターネットセッションを閉じる If (hConnection <> 0) Then InternetCloseHandle hConnection 'インターネットサービスを閉じる If (hOpen <> 0) Then InternetCloseHandle hOpen End Sub |
● テキストファイルをアップロードするサンプル プログラム '=========================== ' FTPでテキストファイルをアップロードする '=========================== Private Sub Sample() Dim hOpen As Long 'インターネットサービスのハンドル Dim hConnection As Long 'インターネットセッションのハンドル Dim result As Long hOpen = 0 hConnection = 0 'インターネットサービスのハンドル取得 - hOpen hOpen = InternetOpen("FTPSample", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) If (hOpen <> 0) Then 'ハンドル取得成功 'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection hConnection = InternetConnect(hOpen, "HogeSvr", INTERNET_INVALID_PORT_NUMBER, _ "HogeUsr", "HogePwd", INTERNET_SERVICE_FTP, 0, 0) If (hConnection <> 0) Then '接続成功 'FTPサーバのカレントディレクトリを変更 result = FtpSetCurrentDirectory(hConnection, "/export/home/tatsuya") If (result <> 0) Then 'ディレクトリ変更成功 'ファイルをアップロード result = FtpPutFile(hConnection, "c:¥test¥sample.txt", "sample.txt", FTP_TRANSFER_TYPE_ASCII, 0) If (result = 0) Then 'アップロード失敗 MsgBox "ファイルの取得に失敗しました。" & Err.LastDllError End If Else MsgBox "ディレクトリの移動に失敗しました。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If 'インターネットセッションを閉じる If (hConnection <> 0) Then InternetCloseHandle hConnection 'インターネットサービスを閉じる If (hOpen <> 0) Then InternetCloseHandle hOpen End Sub |
● 指定ディレクトリのファイル一覧を取得するサンプル プログラム '=============================== ' FTPで指定ディレクトリのファイル一覧を取得する '=============================== Private Sub Sample() Dim hOpen As Long 'インターネットサービスのハンドル Dim hConnection As Long 'インターネットセッションのハンドル Dim result As Long hOpen = 0 hConnection = 0 Dim hFind As Long Dim w32FindData As WIN32_FIND_DATA Dim strFile As String Dim FileList() As string 'ファイル名一覧 Dim cnt As Long cnt = -1 'インターネットサービスのハンドル取得 - hOpen hOpen = InternetOpen("FTPSample", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) If (hOpen <> 0) Then 'ハンドル取得成功 'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection hConnection = InternetConnect(hOpen, "HogeSvr", INTERNET_INVALID_PORT_NUMBER, _ "HogeUsr", "HogePwd", INTERNET_SERVICE_FTP, 0, 0) If (hConnection <> 0) Then '接続成功 'FTPサーバのカレントディレクトリを変更 result = FtpSetCurrentDirectory(hConnection, "/export/home/tatsuya") If (result <> 0) Then 'ディレクトリ変更成功 'ファイルリストを取得 hFind = FtpFindFirstFile(hConnection, "*.*", w32FindData, INTERNET_FLAG_RELOAD, 0) If (hFind = 0) Then MsgBox "ファイル名を取得できませんでした。" & Err.LastDllError Else Do strFile = Left(w32FindData.cFileName, InStr(w32FindData.cFileName, vbNullChar) - 1) strFile = Mid(strFile, InStrRev(strFile, " ") + 1) 'ファイル名にゴミが付く場合は、排除。 If ((w32FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = &H10) Then strFile = strFile & "/" 'ディレクトリなら "/" を付ける End If cnt = cnt + 1 ReDim Preserve FileList(cnt) FileList(cnt) = strFile 'ファイル名(ディレクトリ名)をファイル名リストに追加 Debug.Print strFile 'Debug Loop Until InternetFindNextFile(hFind, w32FindData) = 0 '次のファイル名を取得 End If Else MsgBox "ディレクトリの移動に失敗しました。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If Else MsgBox "FTPサーバへ接続できませんでした。" & Err.LastDllError End If 'インターネットセッションを閉じる If (hConnection <> 0) Then InternetCloseHandle hConnection 'インターネットサービスを閉じる If (hOpen <> 0) Then InternetCloseHandle hOpen End Sub |
● InternetOpen
※ 失敗した場合は、NULLが返ります。 |
● InternetConnect
|
● InternetCloseHandle
|
● FtpGetCurrentDirectory
|
● FtpSetCurrentDirectory
|
● FtpGetFile
|
● FtpPutFile
※ 転送先に既に同じファイル名が存在した場合は、上書きされます。 ※ 転送元のファイルが存在しなければ、エラーになります。 |
● FtpDeleteFile
|
● FtpRenameFile
|
● FtpRemoveDirectory
※ 削除するディレクトリが空でなければ、エラーになります。 |
● 標準モジュール (エラー定数) ' Constants - The WinINet functions return error codes. |