Using FTP to download each file *WHILE* getting the file list

前端 未结 2 1995
谎友^
谎友^ 2020-12-06 07:58

We need to get about 100 very small files from a remote FTP server using vb.net. Our company won\'t let us buy (or install) any 3rd party ftp libraries... so we are forced t

相关标签:
2条回答
  • 2020-12-06 08:15

    Something I just put together, the important part is the fwr.Proxy = Nothing, otherwise it tries to auto get the proxy settings which causes huge delays so setting it to nothing forces it to not use one.

    If you are using a proxy obviously you need to set this to an actual 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
    

    I know its a bit late but hopefully helps

    0 讨论(0)
  • 2020-12-06 08:25

    Take a look at my FTP class, it might be exactly what you need.

    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
    

    To initialize:

    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
    
    0 讨论(0)
提交回复
热议问题