VB.Net实现Ftp下载的方法

本文介绍了如何使用VB.Net进行FTP文件下载,包括设置二进制模式、创建数据连接、续传功能等步骤,详细展示了DownloadFile方法和CreateDataSocket方法的实现过程。

调用方式:

DownloadFile("abc.rar","d:/abc.rar","Flase") '  3个参数分别为远程ftp的文件名、保存到本地的完整路径、是否续传

功能函数:

   Public Sub DownloadFile(ByVal Str_RemoteFileName As String, _
                               ByVal Str_LocalFileName As String, _
                               ByVal Bool_Resume As Boolean)
        Dim Data_St As Stream
        Dim output As FileStream
        Dim LobSocket As Socket
        Dim offset, npos As Long
        If (Not Logined()) Then  
            Logined()
        End If
        SetBinaryMode(True)
        If (Str_LocalFileName.Equals("")) Then
            Str_LocalFileName = Str_RemoteFileName
        End If

        If (Not (File.Exists(Str_LocalFileName))) Then
            Data_St = File.Create(Str_LocalFileName)
            Data_St.Close()
        End If

        output = New FileStream(Str_LocalFileName, FileMode.Open)
        LobSocket = CreateDataSocket()
        offset = 0

        If (Bool_Resume) Then
            offset = output.Length

            If (offset > 0) Then
                SendCommand("REST " & offset)
                Str_Reply = ServerReply(True)
                Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))
                If (Int_Reply <> 350) Then
                    offset = 0
                End If
            End If

            If (offset > 0) Then
                npos = output.Seek(offset, SeekOrigin.Begin)
            End If
        End If

        SendCommand("RETR " & Str_RemoteFileName)
        Str_Reply = ServerReply(True)
        Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))

        If (Not (Int_Reply = 150 Or Int_Reply = 125)) Then
            MsgBox(Str_Reply.Substring(4))
        End If

        Do While (True)
            Array.Clear(Byte_Buffer, 0, Byte_Buffer.Length)
            Int_Bytes = LobSocket.Receive(Byte_Buffer, Byte_Buffer.Length, 0)
            output.Write(Byte_Buffer, 0, Int_Bytes)

            If (Int_Bytes <= 0) Then
                Exit Do
            End If
        Loop

        output.Close()
        If (LobSocket.Connected) Then
            LobSocket.Close()
        End If

        Str_Reply = ServerReply(True)
        Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))
        If (Not (Int_Reply = 226 Or Int_Reply = 250)) Then
            MsgBox(Str_Reply.Substring(4))
        End If

    End Sub

    Private Function CreateDataSocket() As Socket

        Dim index1, index2, len As Int32
        Dim partCount, i, port As Int32
        Dim ipData, buf, ipAddress As String
        Dim parts(6) As Int32
        Dim ch As Char
        Dim s As Socket
        Dim ep As IPEndPoint
        SendCommand("PASV")
        Str_Reply = ServerReply(True)
        Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))
        If (Int_Reply <> 227) Then
            MsgBox(Str_Reply.Substring(4))
        End If
        index1 = Str_Reply.IndexOf("(")
        index2 = Str_Reply.IndexOf(")")
        ipData = Str_Reply.Substring(index1 + 1, index2 - index1 - 1)
        len = ipData.Length
        partCount = 0
        buf = ""
        For i = 0 To ((len - 1) And partCount <= 6)
            ch = Char.Parse(ipData.Substring(i, 1))
            If (Char.IsDigit(ch)) Then
                buf += ch
            ElseIf (ch <> ",") Then
                MsgBox(Str_Reply)
            End If

            If ((ch = ",") Or (i + 1 = len)) Then
                Try
                    parts(partCount) = Int32.Parse(buf)
                    partCount += 1
                    buf = ""
                Catch ex As Exception
                    MsgBox(Str_Reply)
                End Try
            End If
        Next
        ipAddress = parts(0) & "." & parts(1) & "." & parts(2) & "." & parts(3)
        port = parts(4) * (2 ^ 8)
        port = port + parts(5)
        s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        ep = New IPEndPoint(Dns.GetHostEntry(ipAddress).AddressList(0), port)
        Try
            s.Connect(ep)
        Catch ex As Exception

            MsgBox("无法连接到远程ftp服务器")
        End Try
        Return s

    End Function

    Public Sub SetBinaryMode(ByVal bMode As Boolean)

        If (bMode) Then
            SendCommand("TYPE I")
        Else
            SendCommand("TYPE A")
        End If
        Str_Reply = ServerReply(True)
        Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))
        If (Int_Reply <> 200) Then
            MsgBox("111" & Str_Reply.Substring(4))
        End If
    End Sub

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值