- 締切済み
FTPにフォルダのファイル全部をアップするには?
Visual Basic 2010 で、ローカルの指定フォルダに作ったファイルを、FTPの指定フォルダに全てアップロードする方法を探しています。 http://dobon.net/vb/dotnet/internet/ftpwebrequest.html を参考にしましたが、ここや、Googleで見付かるサンプルコードは、1:1でファイルをアップするものばかりで、フォルダにあるファイル全部をアップロードするものはなかなかありません。 そこで、上記サイトを参考に次のようなモジュールを組んでみました。 Form1 には、テキストボックスとボタン、リストボックスを配置してあります。 Private ftpCredential As System.Net.NetworkCredential ------------------------- Sub main1() Dim Dname As String = Form1.TextBox1.Text Dim Rname As String ftpCredential = New System.Net.NetworkCredential("username", "password") Form1.ListBox1.Items.Clear() ''テキストボックスのフォルダの全ファイル一覧を取得 For Each FName As String In IO.Directory.GetFiles(Dname) Rname = FName.Replace(Form1.TextBox1.Text & "\", "") UploFtpFile("ftp://ftp.hogehoge.ne.jp/www/" + Rname, FName) Form1.ListBox1.Items.Add(Rname) Next DisconnectFtp("ftp://ftp.hogehoge.ne.jp/") End Sub ------------------------- Sub UploFtpFile(ByVal rmFile As String, ByVal loFile As String) Dim ftpReq As System.Net.FtpWebRequest = _ CType(System.Net.WebRequest.Create(rmFile), System.Net.FtpWebRequest) ftpReq.Credentials = ftpCredential ftpReq.Method = System.Net.WebRequestMethods.Ftp.UploadFile Dim reqStrm As System.IO.Stream = ftpReq.GetRequestStream() 'アップロードするファイルを開く Dim fs As New System.IO.FileStream( _ loFile, System.IO.FileMode.Open, System.IO.FileAccess.Read) 'アップロードStreamに書き込む Dim buffer(1023) As Byte While True Dim readSize As Integer = fs.Read(buffer, 0, buffer.Length) If readSize = 0 Then Exit While End If reqStrm.Write(buffer, 0, readSize) End While fs.Close() reqStrm.Close() End Sub ------------------------- Sub DisconnectFtp(ByVal uri As String) Dim ftpReq As System.Net.FtpWebRequest = _ DirectCast(System.Net.WebRequest.Create(uri), System.Net.FtpWebRequest) ftpReq.Method = System.Net.WebRequestMethods.Ftp.PrintWorkingDirectory ftpReq.KeepAlive = False End Sub End Module ------------------------- テキストボックスをフォルダとして、そのフォルダ内のファイルを全て、順番にアップロードしていき、最後に切断というのが希望の動作です。 ステップオーバーしながら監視していた所では、希望通り次々とファイルをアップロードしているようです。 気になるのは、上記のサイトの下の方に、 「TPサーバーとの接続と切断を繰り返すように思われるかもしれませんが、そうではありません」とはあるものの、これで本当に接続は切れていないのか? 相手のFTPに過負荷になるのではないか? 接続の確立や、インスタンス処理に問題があるのではないか? という疑問があります。 コードとして問題がないようでしたら、本番のプロジェクトのモジュールに組み込んで、自動ファイル生成から、そのアップロードまでが完成するのですが… なにか問題になりそうなところがあったり、「連続で全ファイルアップするなら、もっと簡単な方法があるよ」と御存知の方がいらしたら、教えてください。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- sakaki_san
- ベストアンサー率45% (5/11)
こっちのどぼんさんの方法がシンプルでいいのではないでしょうか? http://dobon.net/vb/dotnet/internet/ftpwebclient.html wc.Dispose()の前にアップロードを繰り返す方法 FTPログを見てみると接続/切断を繰り返していない 欠点はwc.Dispose()を命令しても、FTP切断せず アプリを終了した時点で切断となること
お礼
ありがとうございます。確かにこちらが簡単ですね。 テストプロジェクトとして ------------ Dim Dname As String = Form1.TextBox1.Text Dim Rname As String 'WebClientオブジェクトを作成 Dim wc As New System.Net.WebClient() 'ログインユーザー名とパスワードを指定 wc.Credentials = New System.Net.NetworkCredential(Form1.TextBox2.Text, Form1.TextBox3.Text) For Each FName As String In IO.Directory.GetFiles(Dname) Rname = FName.Replace(Form1.TextBox1.Text & "\", "") 'FTPサーバーにアップロード wc.UploadFile("ftp://hogehoge.com/" + Rname, FName) Next '解放する wc.Dispose() ------------ としたところ、TextBox1のファイル全てをアップロードできました。 ありがとうございました。