|

|
|
 |
3.1 FTPサーバからファイルをダウンロード |
 |
|
|
|
|
|
FTPサーバからファイルをダウンロードするときは、API関数/InternetOpenとInternetConnectでFTPサーバへ接続した後、API関数/FtpGetFileを使って行います。
参考までに、Access VBA以外に、Excel VBA(エクセルマクロ)など他のVBAでも使用することができます。
|
|
|
|
|
|
|
|
|
|
API関数を使うとき、まずはこの関数がどこにある・どんな関数であるかといった、この関数を使うための準備(API関数の宣言)が必要です。また、定義する場所はフォーム、モジュール、クラスモジュールの(General)(Declarations)です。
次の例は、API関数/FtpGetFileを使うときの記述例です。API関数を使用するときは、ついでにAPI関数で使用する定数も定義しておきましょう。
'(General)(Declarations)へ記述します
'FTPでダウンロード
Private 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 Boolean
'dwFlagsAndAttributes(ダウンロード後のファイルの属性)
'読み込み専用
Private Const FILE_ATTRIBUTE_READONLY As Long = &H1
'隠しファイル
Private Const FILE_ATTRIBUTE_HIDDEN As Long = &H2
'システムファイル
Private Const FILE_ATTRIBUTE_SYSTEM As Long = &H4
'ディレクトリ(フォルダ)
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10
'アーカイブファイル
Private Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20
'通常のファイル
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
'dwFlags(転送方法)
'アスキーモード
Private Const FTP_TRANSFER_TYPE_ASCII As Long = &H1
'バイナリモード
Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H2
'dwFlags(ダウンロード方法)
'キャッシュを無視し、サーバから強制的にダウンロード
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
'ダウンロードファイルをキャッシュに加えない
Private Const INTERNET_FLAG_DONT_CACHE As Long = &H4000000
'サーバから再読み込みします
Private Const INTERNET_FLAG_RESYNCHRONIZE As Long = &H800
'キャッシュできないときに一時ファイルを生成
Private Const INTERNET_FLAG_NEED_FILE As Long = &H10
'有効期限、最終更新時刻がサーバから返されない場合は強制的に再読み込み
Private Const INTERNET_FLAG_HYPERLINK As Long = &H400
|
※決まり事なので、悩まずにコピペして使ってしまいましょう
なお、この関数の戻り値にはダウンロードが成功したか、失敗したかが返ります。True*が成功、Falseが失敗です。失敗したときは、FTPサーバに接続できているか、ダウンロード元のパスは存在するか、ダウンロード先のパス(フォルダ)が存在するかをチェックしましょう。
( )内に記述している引数は、以下を参照してください。
◆FtpGetFileの引数
| ByVal hConnect As Long |
InternetConnectで取得したFTPハンドルを指定します。
|
| ByVal lpszRemoteFile As String |
ダウンロード対象のファイル(サーバにあるファイル)を指定します。できるだけフルパスで指定しましょう。
|
| ByVal lpszNewFile As String |
ローカルの保存先フォルダとファイル名を指定します。フルパスで指定しましょう。
|
| ByVal fFailIfExists As Boolean |
ローカルのファイルを上書きするかどうかを指定します。Falseを指定するとローカルのファイルを上書き、Trueを指定したときは、ローカルにファイルを新規作成できるとき(ローカルに同じ名前のファイルが無いとき)だけダウンロードします。
|
| ByVal dwFlagsAndAttributes As Long |
ローカルに保存するファイルの属性を指定します。通常はFILE_ATTRIBUTE_NORMALでOK。
|
| ByVal dwFlags As Long |
転送モードを指定します。一般的に、htmlなどのテキストファイルの時はアスキーモード、jpgやgifなどのファイルの時はバイナリモードを指定します。
|
| ByVal dwContext As Long |
0を指定しておいてOKです。
|
*VBではTrueは「-1」ですが、このAPIではTrueのときに「1」が返ります。そのため、実行結果はErr.LastDllErrorで参照するようにしてください。こちらは、0が正常終了、0以外が異常終了です。
|
|
|
|
|
|
|
|
|
|
FtpGetFileを使って、FTPサーバからファイルをダウンロードする例です。Subプロシージャ「prcFTPDownLoadSample」を実行すると、FTPサーバへ接続しファイルのダウンロードを行います。
FTPサーバからファイルをダウンロードするには、InternetOpenとInternetConnectを使ってFTPサーバへ接続した後、FtpGetFileを実行します。FtpGetFileの引数hConnectには、FTPサーバへ接続したときのハンドル(例ではlngFtpHnd)を指定しましょう。
例では、Functionプロシージャ「fcFTPGetFile」で、渡された引数の内容を使い(dRmtが"/work/data/filename.txt"、dLcが"c:\happy\filename.txt"、dMdがFTP_TRANSFER_TYPE_ASCII)、FTPサーバからファイルをダウンロードしています。ローカルファイルの上書き有無はFalse(上書きする)です。
'変数の定義 ※(General)(Declarations)です
Private lngWinINet As Long 'インターネットハンドルの保存用
Private lngFtpHnd As Long 'FTPハンドルの保存用
Sub prcFTPDownLoadSample()
Dim lngRC As Long
'インターネットサービスをオープンします
lngRC = fcInternetOpen
'オープンに成功したらFTPサーバとの接続と切断を行います
If lngRC = 0 Then
'FTPサーバへ接続します
lngRC = fcFTPConnect("ftp.happy-happy-island.net", "happy", "island")
'接続に成功したら、FTPサーバからファイルをダウンロードします
If lngRC = 0 Then
Call fcFTPGetFile("/work/data/filename.txt" _
, "c:\happy\filename.txt" _
, FTP_TRANSFER_TYPE_ASCII)
End If
End If
'FTPをクローズします
Call fcFTPDisConnect
'インターネットサービスをクローズします
Call fcInternetClose
End Sub
Function fcFTPGetFile(dRmt As String, dLc As String, dMd As Long) As Boolean
'dRmt/リモートファイル
'dLc /ローカルファイル
'dMd /転送モード
'FTPサーバからファイルをダウンロード
fcFTPGetFile = FtpGetFile(lngFtpHnd _
, dRmt _
, dLc _
, False _
, FILE_ATTRIBUTE_NORMAL _
, dMd + INTERNET_FLAG_RELOAD _
, 0)
End Function
Function fcFTPConnect(Server As String, User As String, Psw As String) As Long
'APIの実行/FTPサーバへ接続
lngFtpHnd = InternetConnect(lngWinINet _
, Server _
, INTERNET_DEFAULT_FTP_PORT _
, User _
, Psw _
, INTERNET_SERVICE_FTP _
, 0 _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcFTPConnect = Err.LastDllError
End Function
Function fcFTPDisConnect() As Long
'APIの実行/FTPサーバから切断
Call InternetCloseHandle(lngFtpHnd)
'この関数の戻り値には、APIの処理結果コードを返します
fcFTPDisConnect = Err.LastDllError
End Function
Function fcInternetOpen() As Long
'APIの実行/インターネットサービスをオープン
lngWinINet = InternetOpen(vbNullString _
, INTERNET_OPEN_TYPE_PRECONFIG _
, vbNullString _
, vbNullString _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcInternetOpen = Err.LastDllError
End Function
Function fcInternetClose() As Long
'APIの実行/インターネットサービスをクローズ
Call InternetCloseHandle(lngWinINet)
'この関数の戻り値には、APIの処理結果コードを返します
fcInternetClose = Err.LastDllError
End Function
|
※この他に、API関数を定義する必要があります。
※ftp.happy-happy-island.netは架空のドメイン名です。
|
|
|
|
|