5

vb.net を使用して、リモート FTP サーバーから約 100 個の非常に小さなファイルを取得する必要があります。私たちの会社は、サードパーティのftpライブラリを購入(またはインストール)することを許可しません...そのため、FtpWebRequestのようなものを使用することを余儀なくされています. (または、既に Visual Studio に含まれている、より優れた無料の選択肢はありますか?)

この方法は機能しますが、非常に遅いです。(ログイン/ログアウトが頻繁に行われるためだと思います。)

ユーザー名とパスワードでログインします。
リモート サーバーからファイル リストを取得します。
ログアウト
そのファイルリストを使用して、各ファイルを個別に取得します。
ログインしてファイルを取得し、ログアウトします。
さらに 99 回ログインし、各ファイルを取得し、毎回ログアウトします。

代わりに、おそらくこれを行う必要がありますが、うまくいきません。

ユーザー名とパスワードでログインします。一度。
ファイル名のリストを取得します。
各ファイルをダウンロードします。
一度ログアウトします。

「FTPファイルリストを取得する」および後で「FTPで1つのファイルをダウンロードする方法」の無数の例をオンラインで見つけました...しかし、「各ファイル名を取得して今すぐダウンロードする」ことはありません.

Dim fwr As Net.FtpWebRequest = Net.FtpWebRequest.Create(ftpSite)
fwr.Credentials = New NetworkCredential(userName, password)
fwr.KeepAlive = True
fwr.Method = WebRequestMethods.Ftp.ListDirectory

   Dim sr As IO.StreamReader = Nothing
   試す
      sr = 新しい IO.StreamReader(fwr.GetResponse().GetResponseStream())
      Do until (sr.EndOfStream())
         ファイル名 = sr.ReadLine()

         fwr.Method = WebRequestMethods.Ftp.DownloadFile

         出力 = ""
         Dim sr2 As IO.StreamReader = Nothing
         試す
            sr2 = 新しい IO.StreamReader(fwr.GetResponse().GetResponseStream())
            出力 = sr2.ReadToEnd()

         ex を例外としてキャッチ

         エンドトライ

         If (Not sr2 Is Nothing) Then sr2.Close() : sr2 = Nothing

         Call MsgBox("Got " & ファイル名 & LF & 出力)
        ループ

   ex を例外としてキャッチ

   エンドトライ

   If (Not sr Is Nothing) Then sr.Close() : sr = Nothing
   If (Not fwr Is Nothing) Then fwr = Nothing
4

2 に答える 2

1

私がまとめたもの、重要な部分は fwr.Proxy = Nothing です。そうしないと、プロキシ設定を自動的に取得しようとするため、大幅な遅延が発生するため、何も設定しないと強制的に使用されなくなります。

明らかにプロキシを使用している場合は、これを実際のプロキシに設定する必要があります。

Dim fwr As Net.FtpWebRequest = Net.FtpWebRequest.Create(ftpAddress)
fwr.Credentials = New NetworkCredential(userName, password)
fwr.KeepAlive = True
fwr.Method = WebRequestMethods.Ftp.ListDirectory
fwr.Proxy = Nothing

Try
    Dim sr As New IO.StreamReader(fwr.GetResponse().GetResponseStream())
    Dim lst = sr.ReadToEnd().Split(vbNewLine)
    For Each file As String In lst
        file = file.Trim() 'remove any whitespace
        If file = ".." OrElse file = "." Then Continue For
        Dim fwr2 As Net.FtpWebRequest = Net.FtpWebRequest.Create(ftpAddress & file)
        fwr2.Credentials = fwr.Credentials
        fwr2.KeepAlive = True
        fwr2.Method = WebRequestMethods.Ftp.DownloadFile
        fwr2.Proxy = Nothing

        Dim fileSR As New IO.StreamReader(fwr2.GetResponse().GetResponseStream())
        Dim fileData = fileSR.ReadToEnd()
        fileSR.Close()
    Next

    sr.Close()
Catch ex As Exception
End Try

私はそれが少し遅れていることを知っていますが、うまくいけば助けます

于 2011-06-05T21:54:52.090 に答える