FTPサーバーからのファイルコピー
勉強させてください。
vb2010.net
win764bit
FTPサーバーにアクセスし、FTPサーバーにあるCSVファイルをすべて
指定のフォルダにコピーしたいのです。
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#downloadfile
を参考に作成しましたがうまくいきません。
1, Cドライブにコピーしたいのですが下記部分でアクセスに拒否されましたと
エラーが発生します。
Dim fs As New System.IO.FileStream( _
downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)
フォルダの設定をPrivate Const PATH_Folder = " C:\DATA"から
Private Const PATH_Folder = " \DATA"に変更するとサーバー上にアクセス(ファイルの書き込み)
が行われます。(プログラムの保存先が影響?)
指定したローカルにコピーするにはどうしららよいでしょうか。
2,1でサーバー上にファイルの書き込みができたのですが、FTPサーバーにあるCSVのデータの内容を
書くみたいでコピーできませんでした。
fs.Write(buffer, 0, readSize)をfs.CopyTo()に変更すればいいのではないかとおもい変更してみましたが、
fs.CopyTo(ここがわからない)が理解できずに動作しません。
アドバイスよろしくお願いいたします。
Imports System.Net
Imports System.IO
Module Module1
'FTP用host
Private Const FTP_HOST = "ftp://TEST"
'FTP用USER
Private Const FTP_USER = "ftpuser"
'FTP用PASSWORD
Private Const FTP_PASS = "ftppass"
'FTPファイルコピー先フォルダ
Private Const PATH_Folder = " C:\DATA"
Private Function FTPDownLoad() As Boolean
FTPDownLoad = False
'Try
'ダウンロードするファイルのURI
Dim u As New Uri(FTP_HOST)
'ダウンロードしたファイルの保存先
Dim downFile As String = PATH_Folde
Sub Main()
'-----------------------------
'-- FTP データ取得
'-----------------------------
If FTPDownLoad() = False Then
body = "FTPからのデータダウンロードに失敗しました。" + vbCrLf + sys_date & sys_time
Exit Sub
End If
Private Function FTPDownLoad() As Boolean
FTPDownLoad = False
'Try
'ダウンロードするファイルのURI
Dim u As New Uri(FTP_HOST)
'ダウンロードしたファイルの保存先
Dim downFile As String = Palet_PATH_Folder
'FtpWebRequestの作成
Dim ftpReq As System.Net.FtpWebRequest = _
CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
'ログインユーザー名とパスワードを設定
ftpReq.Credentials = New System.Net.NetworkCredential(FTP_USER, FTP_PASS)
'MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
'ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
'要求の完了後に接続を閉じる
ftpReq.KeepAlive = False
'ASCIIモードで転送する
ftpReq.UseBinary = False
'PASSIVEモードを無効にする
ftpReq.UsePassive = False
'FtpWebResponseを取得
Dim ftpRes As System.Net.FtpWebResponse = _
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()
'FTPサーバーから送信されたステータスを表示
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
'閉じる
ftpRes.Close()
'Catch ex As Exception
' MsgBox(ex.Message)
' Exit Function
'End Try
FTPDownLoad = True
End Function
END sub
お礼
返答ありがとうございます 質問者のlc-fです。 質問がいい加減ですみませんでした。 自分のPC内でテストをしているのですが、IISで自己署名入り証明書の作成で、仮のSSL証明書を作りました。 それをFTPのSSL設定で証明書として設定しました。 それから先述しましたFtpWebRequestを使用してダウンロードのテストをしてみたのですが、普通にダウンロードできました。 ちなみにSSLを適用する前のソースと同じソースです。 そこで思ったのが、SSLを適用したのに、うんともすんとも言わずにすんなり通ってしまったことに不安を感じました。 というのが昨日までの流れなんですが、質問投稿後にまた疑惑が浮上し、「本当にSSLが適用できているのか?」思い、確認してみたところ、おそらく適用されていないように思います。 確認したのはIEでFTPサーバーにアクセス後、右クリック→プロパティで確認したところ、「暗号化なし」となっていました。 まずはここからですね。 あとIISは7.0ではなく7.5でした。 失礼しました。
補足
お礼の後ですが・・・ サーバーの設定で暗号化できました。 次にVBでアクセスしてみたところエラーが表示されました。 内容は「リモート サーバーがエラーを返しました: (534) 534-Policy requires SSL. Win32 error: Access is denied. Error details: SSL policy requires SSL for control channel. 534 End」 です 以下ソースです Dim szRequest As FtpWebRequest = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) szRequest.Credentials = New System.Net.NetworkCredential("ftpuser", "psw") szRequest.Method = WebRequestMethods.Ftp.GetFileSize Dim szResponse As FtpWebResponse = CType(szRequest.GetResponse(), System.Net.FtpWebResponse) ←ここでエラー発生 調べた結果以下のように追加したらうまくいきました Dim szRequest As FtpWebRequest = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) szRequest.Credentials = New System.Net.NetworkCredential("ftpuser", "psw") szRequest.Method = WebRequestMethods.Ftp.GetFileSize szRequest.EnableSsl = True ←☆この行を追加しました☆ Dim szResponse As FtpWebResponse = CType(szRequest.GetResponse(), System.Net.FtpWebResponse)