FtpSetCurrentDirectoryで

解決


Phantom  2006-06-09 01:17:30  No: 95681

お世話になっています。
最近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  また、長文失礼しました。


Hongliang  URL  2006-06-09 01:36:16  No: 95682

VB6 のコードから移植したんですかね?  一部、Long が残ってしまっていますね。
またハンドルはできれば Integer ではなく IntPtr を使うべきです。

それから、Option Strict On にして型を意識するようにしましょう。


Phantom  2006-06-09 02:16:13  No: 95683

言われた通りに型に意識して修正してみて実行したらあっけなくできました>w<
こんな簡単なことにわざわざ返答してくださったHongliang様ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加