FTP-DownLoad

Last-modified: 2011-02-07 (月) 18:50:01

VBサンプル

''' <summary>FTPでファイルをダウンロードする!</summary>
   ''' <param name="sURL">対象のURL、ftp://から始まる</param>
   ''' <param name="sID">ID</param>
   ''' <param name="sPW">パスワード</param>
   ''' <param name="sFile">対象のファイル</param>
   ''' <param name="sDownFile">対象ファイルの保存場所(フルパス)</param>
   ''' <param name="FlagReName">対象ファイルをダウンロード後にリネームするか,1:ならリネームする。それ以外は何もしない</param>
   ''' <returns>FTP処理の結果を返す。正常終了なら0を返す</returns>
   ''' <remarks>返り値:0=正常終了、1=ファイルなし、2=アクセス拒否、-1=その他の例外</remarks>
   Public Function FtpDL(ByVal sURL As String, ByVal sID As String, ByVal sPW As String, ByVal sFile As String, ByVal sDownFile As String, ByVal FlagReName As Integer) As Integer
       Try
           Dim i As Integer = 0
           Dim u As New Uri(sURL) 'ダウンロードするファイルのURI
           Dim DownFile As String = sDownFile 'ダウンロードするファイルの保存先
           'FtpWebRequestの作成
           Dim ftpReq As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
           Dim ftpRes As System.Net.FtpWebResponse     'FtpWebResponseの作成
           '-----------------------------------------------------------------------------
           'ログインユーザー名とパスワードを設定
           '-----------------------------------------------------------------------------
           ftpReq.Credentials = New System.Net.NetworkCredential(sID, sPW)
           'MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
           'ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile4
           'ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
           ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectory
           ftpReq.KeepAlive = False '要求の完了後に接続を閉じる
           ftpReq.UseBinary = False 'ASCIIモードで転送する
           ftpReq.UsePassive = False 'PASSIVEモードを無効にする
           'ftpReq.UsePassive = True 'PASSIVEモードを有効にする(サーバにより設定が異なる。)
           '-----------------------------------------------------------------------------
           ' ID & PW でレスポンスを取得 (ID or Pw が違えばエラーになる)
           '-----------------------------------------------------------------------------
           Try
               'FtpWebResponseを取得
               ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
           Catch ex As WebException
               Dim res As FtpWebResponse = CType(ex.Response, FtpWebResponse)
               LogTxt("エラー", "FTP接続エラー", "IDもしくはパスワードが違います", res.StatusDescription, "StatusCode:" & res.StatusCode)
               MessageBox.Show(res.StatusDescription, "FTP Error")
               Return 2    ' ログインできない!
               Exit Function
           End Try
           LogTxt("結果", "成功", "FTPアクセス", "", "")
           '-------------------------------------------------------------------------------------------
           '   アクセスしたフォルダからファイルの一覧を取得(対象ファイルの存在確認)
           '-------------------------------------------------------------------------------------------
           ' ※ DotNetのクラスに、FTPにアクセスしたファイルがない時にエラーコードを返さない。
           ' 接続先のサーバ環境に依存するので。コードを返さない,メッセージが日本語化してない等のため
           '  返り値、例外のエラーコードで処理するのも難しいため。
           '  ファイルを一覧取得して対象のファイルがあるかを確認する。
           '--------------------------------------------------------------------------------------------
           Dim Srf As New System.IO.StreamReader(ftpRes.GetResponseStream())            'FTPサーバーから送信されたデータを取得
           Dim Tx As String = ""
           Tx = Srf.ReadLine
           Dim Flag As Integer = 0
           Do While Not Tx Is Nothing
               If Tx = sFile Then
                   Flag = 1
                   'MessageBox.Show("同じ")
                   Exit Do
               End If
               Tx = Srf.ReadLine
           Loop
           Srf.Close()
           '--------------------------------------------------------------------------------------------
           '   ファイルが存在せず
           '--------------------------------------------------------------------------------------------
           If Flag = 0 Then
               ftpRes.Close() '閉じる
               LogTxt("結果", "FTPサーバにファイルが存在しませんでした", sFile, "", "")
               MessageBox.Show("FTPサーバにアクセスしましたが対象のファイルがありませんでした!")
               Return 1
           End If
           IO.File.Delete(sDownFile)
           My.Application.DoEvents()
           LogTxt("結果", "成功", "対象のファイルが存在しました", sFile, "")
           '--------------------------------------------------------------------------------------------
           '    ファイルをダウンロードする、 FtpRequestを再設定
           '--------------------------------------------------------------------------------------------
           u = New Uri(sURL & sFile) 'ダウンロードするファイルのURI
           ftpReq = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 'FtpWebRequestの作成
           ftpReq.Credentials = New System.Net.NetworkCredential(sID, sPW) ' ログイン&PWで再設定
           ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
           ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
           '--------------------------------------------------------------------------------------------
           ' ファイルをダウンロードするためのStreamを取得
           Dim resStrm As System.IO.Stream = ftpRes.GetResponseStream()
           'ダウンロードしたファイルを書き込むためのFileStreamを作成
           Dim fs As New System.IO.FileStream(DownFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)
           'ダウンロードしたデータを書き込む
           Dim buffer(1023) As Byte
           While True
               Dim readSize As Integer = resStrm.Read(buffer, 0, buffer.Length)
               If readSize = 0 Then
                   Exit While
               End If
               fs.Write(buffer, 0, readSize)
           End While
           fs.Close()
           resStrm.Close()
           LogTxt("結果", "成功", "FTPダウンロード", sFile, "---> " & sDownFile)
           '--------------------------------------------------------------------------------------------
           '  ダウンロードしたファイルをリネームする。
           '--------------------------------------------------------------------------------------------
           If FlagReName = 1 Then
               'u = New Uri(sURL & sFile) 'ダウンロードするファイルのURI
               ftpReq = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 'FtpWebRequestの作成
               ftpReq.Credentials = New System.Net.NetworkCredential(sID, sPW) ' ログイン&PWで再設定
               ftpReq.Method = System.Net.WebRequestMethods.Ftp.Rename
               ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
           End If
           'FTPサーバーから送信されたステータスを表示
           'Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
           ftpRes.Close() '閉じる
           Return 0
       Catch ex As WebException
           Dim res As FtpWebResponse = CType(ex.Response, FtpWebResponse)
           LogTxt("エラー", "FTPダウンロード", res.StatusDescription, res.StatusCode, ex.StackTrace)
           MessageBox.Show(res.StatusDescription, "FTPエラー")
           Return -1
       Catch ex As Exception
           LogTxt("エラー", "FTPダウンロード", "想定外エラー", ex.Message, ex.StackTrace)
           MessageBox.Show(ex.Message)
           Return -1
       End Try
   End Function

周辺技術

パッシブモード

参考

上記の2点様のサンプルは、大変、参考になりました。 謝謝各位

サンプル

  • Visual Studioをインストールしたらパソコンの中にサンプルプログラムができる
    例,CドライブにVS2010をインストールした場合のフォルダのパス
    C:\Program Files\Microsoft Visual Studio 10.0\Samples\1041

参考

参考書籍

amazon.gif

サイト内リンク

DB

Office