zoukankan      html  css  js  c++  java
  • VB.Net实现Ftp下载的方法

    调用方式:

    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

  • 相关阅读:
    install source mysql 5.7.9
    直接复制php的安装目录部署到其他服务器的时候,无法运行
    对硬盘进行分区时,GPT和MBR有什么区别?
    centos添加永久静态路由
    Windows2008R2安装远程桌面终端授权
    nginx搭建的cdn服务器的nginx.conf配置文件
    centos6.6配置vlan三层交换
    ESXI 6.0 嵌套虚拟化 Hyper-v
    VLAN的Hybrid和Trunk端口有何区别
    如何添加使用博客RSS订阅
  • 原文地址:https://www.cnblogs.com/NetPig/p/2096804.html
Copyright © 2011-2022 走看看