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に過負荷になるのではないか?
接続の確立や、インスタンス処理に問題があるのではないか?
という疑問があります。
コードとして問題がないようでしたら、本番のプロジェクトのモジュールに組み込んで、自動ファイル生成から、そのアップロードまでが完成するのですが…
なにか問題になりそうなところがあったり、「連続で全ファイルアップするなら、もっと簡単な方法があるよ」と御存知の方がいらしたら、教えてください。
よろしくお願いします。
お礼
ありがとうございました。 Inet.OpenURL ではうまくいかないのですが、Inet.Execute ではうまくいきました。一行で書くと Inet.Execute "ftp://username:password@hostname", "GET test.lzh e:\tmp\test.lzh" みたいな感じです。 GET(ダウンロード)もPUT(アップロード)もこれでいけました。 もちろん With Inet1 .URL = "ftp://ftp.hoge.com" .UserName = "TAGOSAKU7" .Password = "内緒" .Execute , " DIR" End With の書き方でもOKでした。 ところが、問題点がふたつ。 1.ダウンロードやアップロードが終わってアプリケーションを終了するときに、 Inet.Cancel を記述しているのですが、5秒ぐらいかかります。 Private Sub Inet.StateCanged(Byval State As Integer) を記述すると なぜかすぐ終わります。解せません。 2.GET と PUT はうまくいくのですが、CD や DIR がちゃんと動きません。 まだ、分かっていないところがあるのだと思います。 またいろいろとやってみますが、何かお気づきのことがありましたらお教えください。取り敢えずお礼まで。
補足
ありがとうございます。 早速試してみます。 仕事先のことなので結果のご報告は夕方になりますが。