• 締切
  • 困ってます

FTPにフォルダのファイル全部をアップするには?

  • 質問No.8559398
  • 閲覧数4045
  • ありがとう数15
  • 回答数1

お礼率 75% (65/86)

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件)

  • 回答No.1

ベストアンサー率 45% (5/11)

こっちのどぼんさんの方法がシンプルでいいのではないでしょうか?
http://dobon.net/vb/dotnet/internet/ftpwebclient.html

wc.Dispose()の前にアップロードを繰り返す方法

FTPログを見てみると接続/切断を繰り返していない

欠点はwc.Dispose()を命令しても、FTP切断せず
アプリを終了した時点で切断となること
お礼コメント
ky2605

お礼率 75% (65/86)

ありがとうございます。確かにこちらが簡単ですね。

テストプロジェクトとして
------------
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のファイル全てをアップロードできました。

ありがとうございました。
投稿日時:2014/04/23 18:49
関連するQ&A
ページ先頭へ