お世話になっています。
最近VBをやり始めてFTPを使ったプログラムを作る。ということを目標として作っているんですが・・・色々と悪戦苦闘中です。
ここの過去ログを参照したり、他にも転々と他のサイトを参照したりしてはいるんですがどうやら上手くいきません・・・。
現状はFTPでのセッションはできている状態で、そこからFtpGetFileやFtpSetCurrentDirectory等の指示が上手くいかない。と言った状態ですね。
初心者なコードの書き方ですが、どこが間違ってるのかどなたかご教授お願い致しますm(_ _)m申し訳ないです。開発環境はVB.NET2003です。
----------------------以下コード---------------------
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal lpszAgent As String, _
ByVal dwAccessType As Integer, _
ByVal lpszProxyName As String, _
ByVal lpszProxyBypass As String, _
ByVal dwFlags As Integer) As Integer
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Integer, _
ByVal sServerName As String, _
ByVal nServerPort As Integer, _
ByVal sUsername As String, _
ByVal sPassword As String, _
ByVal lService As Integer, _
ByVal lFlags As Long, _
ByVal lContext As Integer) As Integer
Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias"FtpSetCurrentDirectoryA" ( _
ByVal hFtpSession As Long, _
ByVal lpszDirectory As String) As Boolean
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" ( _
ByVal hFtpSession 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
Public Declare Function InternetCloseHandle Lib "wininet.dll" ( _
ByVal hInet As Integer) As Integer
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_DEFAULT_FTP_PORT = 21
Public Const INTERNET_SERVICE_FTP = 1
Public Const INTERNET_FLAG_ASYNC = &H10000000
Public Const INTERNET_FLAG_PASSIVE = &H8000000
Public Const FTP_TRANSFER_TYPE_BINARY = &H2
Public Const INTERNET_FLAG_TRANSFER_BINARY = FTP_TRANSFER_TYPE_BINARY
Public Const INTERNET_FLAG_RELOAD = &H80000000
Dim hInternet As Long
Dim hFTP As Long
Dim A As Boolean
Dim FtpGet As Boolean
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
hInternet = InternetOpen( _
"", _
INTERNET_OPEN_TYPE_DIRECT, _
vbNullString, _
vbNullString, _
0&)
If hInternet = 0 Then
MsgBox("Open Error! ")
Exit Sub
End If
hFTP = InternetConnect( _
hInternet, _
"ftpサーバー名", _
INTERNET_DEFAULT_FTP_PORT, _
"ユーザー名", _
"パスワード", _
INTERNET_SERVICE_FTP, _
INTERNET_FLAG_PASSIVE, _
0&)
If hFTP = 0 Then
MsgBox("Connect Error!")
Exit Sub
End If
A = FtpSetCurrentDirectory(hFTP, "A")
FtpGet = FtpGetFile( _
hFTP, _
"Sample.txt", _
"C:\Test\GetA.txt", _
False, _
0&, _
INTERNET_FLAG_TRANSFER_BINARY, _
0&)
If FtpGet = False Then
MsgBox("転送失敗")
End If
InternetCloseHandle(hFTP)
InternetCloseHandle(hInternet)
End Sub
----------------------------------------------------------------
やりたいことは、FTPに接続して「A」というフォルダに移動してそこからSample.txtというテキストファイルをローカルに転送したいんですが・・・これで実行してみたところ、FTPとのセッションは値が返ってきたので接続できているとは思うのですが、FtpSetCurrentDirectoryやFtpGetFileを実行するとFalseが返ってきて思うようにいきません。初心者で本当にすみませんけどもご教授お願い致しますm(_ _)m また、長文失礼しました。
VB6 のコードから移植したんですかね? 一部、Long が残ってしまっていますね。
またハンドルはできれば Integer ではなく IntPtr を使うべきです。
それから、Option Strict On にして型を意識するようにしましょう。
言われた通りに型に意識して修正してみて実行したらあっけなくできました>w<
こんな簡単なことにわざわざ返答してくださったHongliang様ありがとうございました!
ツイート | ![]() |