2011-05-09 5 views
4

vb.net을 사용하는 원격 FTP 서버에서 약 100 개의 매우 작은 파일을 가져와야합니다. 저희 회사는 제 3 자의 ftp 라이브러리를 사지 (또는 설치) 못하게하므로 FtpWebRequest와 같은 것을 사용해야합니다. (또는 Visual Studio의 일부인 이미 더 나은 무료 옵션이 있습니까?)FTP를 사용하여 각 파일 다운로드 * WHILE * 파일 목록 가져 오기

이 방법은 효과가 있지만 매우 느립니다.

 
Log in with user name and password. 
Get a file-list from the remote server. 
Log out 
Use that file-list to get each file separtely: 
Log in, get the file, log out. 
Log in 99 more times, get each file, log out each time. 

는 대신, 우리는 아마이 일을해야한다. (I 때문에 IN/OUT 일정 로깅의 가정), 그러나 그것은 결코 작동하지 않습니다 :

 
Log in with user name and password. ONCE. 
Get a list of filenames. 
Download each file. 
Log out ONCE. 

우리는 "가져 오는 동안의 온라인 수많은 사례를 발견 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 
    Try 
     sr = New IO.StreamReader(fwr.GetResponse().GetResponseStream()) 
     Do Until (sr.EndOfStream()) 
     fileName = sr.ReadLine() 

     fwr.Method = WebRequestMethods.Ftp.DownloadFile 

     output = "" 
     Dim sr2 As IO.StreamReader = Nothing 
     Try 
      sr2 = New IO.StreamReader(fwr.GetResponse().GetResponseStream()) 
      output = sr2.ReadToEnd() 

     Catch ex As Exception 

     End Try 

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

     Call MsgBox("Got " & fileName & LF & output) 
     Loop 

    Catch ex As Exception 

    End Try 

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

그냥 배치 파일을 윈도우 표준 FTP를 사용하고 MGET을 사용하지 왜 폴더의 모든 파일을 원한다면? –

+0

아마 대량 파일 조작도하고있을 것입니다. –

답변

1

뭔가, 중요한 부분은 그렇지 않으면 자동 그래서 하나를 사용하지 않도록 강제로 아무것도로 설정 거대한 지연의 원인이되는 프록시 설정을 가져 오려고 시도는 fwr.Proxy = 아무것도입니다.

프록시를 사용하는 경우 분명히 실제 프록시로 설정해야합니다.

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 

나는 후반의 조금 알고 있지만 희망

+0

프록시를 아무것도 설정하지 않아도되며 기본적으로 아무것도 표시되지 않습니다. –

+0

또한 나는이 방법을 제안하지 않을 것이다. 당신은 매우 간단한 것을위한 다차원 연결을 생성합니다. –

3

, 그것은 정확하게 당신이 필요로 수 있습니다 내 FTP 클래스를 살펴 보자하는 데 도움이됩니다.

Public Class FTP 
     '-------------------------[BroCode]-------------------------- 
     '----------------------------FTP----------------------------- 
     Private _credentials As System.Net.NetworkCredential 
     Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String) 
      setCredentials(_FTPUser, _FTPPass) 
     End Sub 
     Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String) 
      Dim _FileInfo As New System.IO.FileInfo(_FileName) 
      Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest) 
      _FtpWebRequest.Credentials = _credentials 
      _FtpWebRequest.KeepAlive = False 
      _FtpWebRequest.Timeout = 20000 
      _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 
      _FtpWebRequest.UseBinary = True 
      _FtpWebRequest.ContentLength = _FileInfo.Length 
      Dim buffLength As Integer = 2048 
      Dim buff(buffLength - 1) As Byte 
      Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead() 
      Try 
       Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream() 
       Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength) 
       Do While contentLen <> 0 
        _Stream.Write(buff, 0, contentLen) 
        contentLen = _FileStream.Read(buff, 0, buffLength) 
       Loop 
       _Stream.Close() 
       _Stream.Dispose() 
       _FileStream.Close() 
       _FileStream.Dispose() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End Sub 
     Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String) 
      Try 
       Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath) 
       _request.KeepAlive = False 
       _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile 
       _request.Credentials = _credentials 
       Dim _response As System.Net.FtpWebResponse = _request.GetResponse() 
       Dim responseStream As System.IO.Stream = _response.GetResponseStream() 
       Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create) 
       responseStream.CopyTo(fs) 
       responseStream.Close() 
       _response.Close() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End Sub 
     Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String) 
      Dim ret As New List(Of String) 
      Try 
       Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath) 
       _request.KeepAlive = False 
       _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails 
       _request.Credentials = _credentials 
       Dim _response As System.Net.FtpWebResponse = _request.GetResponse() 
       Dim responseStream As System.IO.Stream = _response.GetResponseStream() 
       Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream) 
       Dim FileData As String = _reader.ReadToEnd 
       Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 
       For Each l As String In Lines 
        ret.Add(l) 
       Next 
       _reader.Close() 
       _response.Close() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
      Return ret 
     End Function 

     Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String) 
      _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass) 
     End Sub 
    End Class 

는 초기화 :

Dim ftp As New FORM.FTP("username", "password") 

ftp.UploadFile("c:\file.jpeg", "ftp://domain/file.jpeg") 

ftp.DownloadFile("c:\file.jpeg", "ftp://ftp://domain/file.jpeg") 

Dim directory As List(Of String) = ftp.GetDirectory("ftp://ftp.domain.net/") 
     ListBox1.Items.Clear() 
     For Each item As String In directory 
      ListBox1.Items.Add(item) 
     Next