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
周辺技術
パッシブモード
- DOSのFTPコマンドはパッシブモードをサポートしない (参考)ファイルがアップロードできない?
参考
上記の2点様のサンプルは、大変、参考になりました。 謝謝各位
サンプル
- Visual Studioをインストールしたらパソコンの中にサンプルプログラムができる
例,CドライブにVS2010をインストールした場合のフォルダのパスC:\Program Files\Microsoft Visual Studio 10.0\Samples\1041
- VB マイグレーション Tips(日本語サンプル)
- 日本語サンプル
MSIファイルのインストール先:C:\Program Files\Microsoft\VB_Migration_Tips\
- Visual Studio 2005の101のサンプル
マイクロソフト VB2005 サンプル。全て英語
参考
- .NET開発支援 有償で開発で困ったを解決。見積無料
参考書籍
サイト内リンク
DB
Office