VB.NET FTP文件下载

时间:2019-01-09 00:00:59

标签: asp.net vb.net ftp

我正在尝试设置程序以连接到FTP并直接从服务器下载文件。这是我到目前为止所拥有的。我不知道我在做什么错,或者我要去哪里错,因为无论我如何编码,它要么说“ End Expected”,要么说“由于以下原因,方法无法处理 etc ”签名不兼容”

我不知道自己在做什么错,任何帮助将不胜感激。

 Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click

(ByVal downloadpath As String, ByVal ftpuri As String, ByVal ftpusername As String, ByVal ftppassword As String)

    'Create a WebClient.
    Dim request As New WebClient()

    ' Confirm the Network credentials based on the user name and password passed in.
    request.Credentials = New Net.NetworkCredential("Username", "Password")

    'Read the file data into a Byte array
    Dim bytes() As Byte = request.DownloadData("ftp://ftp.yourwebsitename/file.extension")

    Try
        '  Create a FileStream to read the file into
        Dim DownloadStream As FileStream = IO.File.Create("C:\Local\Test.zip")
        '  Stream this data into the file
        DownloadStream.Write(bytes, 0, bytes.Length)
        '  Close the FileStream
        DownloadStream.Close()

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

    MessageBox.Show("Process Complete")

End Sub

2 个答案:

答案 0 :(得分:1)

您可能错误地将现有方法粘贴到Button.Click处理程序中。
重建原来的方法可能就足够了。

请注意,此FTP过程非常简单。仅当从已知的远程资源下载时,才可以依赖它。同样,它不允许显示下载进度,甚至无法取消下载进度。

也许看看https://github.com/azsk/DevOpsKit-docs/tree/master/00c-Addressing-Control-Failures方法,该方法可以轻松实现进度条并在需要时取消下载过程。

此外,如果您有兴趣,可以在WebClient.DownloadDataAsync中找到一些注释和示例表格,可以将其包含在Project中以测试this SO question的某些功能。

Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
    Button16.Enabled = False
    DownloadFile("C:\Local\Test.zip", "ftp://ftp.example.com/file.ext", "[username]", "[password]")
    Button16.Enabled = True
End Sub

Private Sub DownloadFile(destinationPath As String, ftpResource As String, ftpUsername As String, ftpPassword As String)

    Dim client As New WebClient()
    client.Credentials = New NetworkCredential(ftpUsername, ftpPassword)

    Try
        Dim dataBytes() As Byte = client.DownloadData(ftpResource)

        If dataBytes.Length > 0 Then
            File.WriteAllBytes(destinationPath, dataBytes)
            MessageBox.Show("Download Complete")
        Else
            MessageBox.Show("Download failed")
        End If

    Catch ex As WebException
        MessageBox.Show(ex.Message)
    Catch ex As IoException
        MessageBox.Show(ex.Message)
    End Try
End Sub

答案 1 :(得分:0)

这是控制台解决方案。将此文件编译为exe文件,然后双击可执行文件运行该文件,或获取一个调度程序(即Windos Task Scheduler)以打开并运行该文件(文件一打开便运行)。

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Linq
Imports System.Text
Imports System.Net
Imports System.IO

Namespace ConsoleApplication1

    Class Program

        Private Shared Sub Main(ParamArray ByVal args() As String)
            If args.Any Then
                ' Do code that references args
                Dim dt As DateTime = DateTime.Today.AddDays(-1)
                Dim date As String = String.Format("{0:yyyyMMdd}", dt)
                Dim p As Program = New Program
                p.getFTPFile(("raw_CA_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_EM_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_GLB_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_US_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
            Else
                ' Do code that depends on no input arguments.
                Dim dt As DateTime = DateTime.Today.AddDays(-1)
                Dim date As String = String.Format("{0:yyyyMMdd}", dt)
                Dim p As Program = New Program
                p.getFTPFile(("raw_CA_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_EM_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_GLB_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
                p.getFTPFile(("raw_US_"  _
                                + (date + ".txt")))
                ' match a certain pattern in the name of the file
            End If

        End Sub

        Private Sub getFTPFile(ByVal FTPFile As String)
            FTPSettings.IP = "000.000.100.000"
            FTPSettings.UserID = "your_id"
            FTPSettings.Password = "your_password"
            Dim reqFTP As FtpWebRequest = Nothing
            Dim ftpStream As Stream = Nothing
            Try 
                Dim outputStream As FileStream = New FileStream(("C:\Downloads\AFL_Files\" + FTPFile), FileMode.Create)
                reqFTP = CType(FtpWebRequest.Create(("ftp://something@ftp.corp.com/your_path/" + FTPFile)),FtpWebRequest)
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
                reqFTP.UseBinary = true
                reqFTP.Credentials = New NetworkCredential(FTPSettings.UserID, FTPSettings.Password)
                Dim response As FtpWebResponse = CType(reqFTP.GetResponse,FtpWebResponse)
                ftpStream = response.GetResponseStream
                Dim cl As Long = response.ContentLength
                Dim bufferSize As Integer = 2048
                Dim readCount As Integer
                Dim buffer() As Byte = New Byte((bufferSize) - 1) {}
                readCount = ftpStream.Read(buffer, 0, bufferSize)

                While (readCount > 0)
                    outputStream.Write(buffer, 0, readCount)
                    readCount = ftpStream.Read(buffer, 0, bufferSize)

                End While

                ftpStream.Close
                outputStream.Close
                response.Close
            Catch ex As Exception
                If (Not (ftpStream) Is Nothing) Then
                    ftpStream.Close
                    ftpStream.Dispose
                End If

                Throw New Exception(ex.Message.ToString)
            End Try

        End Sub

        Public Class FTPSettings

            Public Shared Property IP As String
                Get
                End Get
                Set
                End Set
            End Property

            Public Shared Property UserID As String
                Get
                End Get
                Set
                End Set
            End Property

            Public Shared Property Password As String
                Get
                End Get
                Set
                End Set
            End Property
        End Class
    End Class
End Namespace