| 给我们留言 | 
最新公告:

  没有公告

您现在的位置: 乐博网 >> VB.Net应用技巧 >> 技术文摘正文
最新推荐 更多内容
VB.Net实现Ftp下载的方法[乐博网原创]
VB.Net实现Ftp下载的方法[乐博网原创]
作者:逍遥    来源:乐博网     更新时间:2011-2-18

本文需要您已经看过上期发布的  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

  • 上一篇:

  • 下一篇:
  • 【字体: 】【打印此文】【关闭窗口
      相关文章:(只显示最新16条)
    Serv-U密码加密原理并实现( ASP.NET基于C# )
    C#管理Serv-U6.4.0.6的方法
    VB.Net实现FTP编程的学习笔记.04.[乐博网]
    VB.Net实现FTP编程的学习笔记.03.[乐博网]
    VB.Net实现FTP编程的学习笔记.02.[乐博网]
    VB.Net实现FTP编程的学习笔记.01.[乐博网]
    VB.Net实现Ftp上传的方法[乐博网原创]
    VB.Net实现登陆Ftp的方法[乐博网原创]
    VB.Net实现FTP下载文件的两种方法

    | 设为首页 | 加入收藏 | 联系站长 | | 友情链接 | 版权申明 |
    乐博网欢迎各种媒体转载我们的原创作品[转载请注明出处];我们鼓励更多VB.Net开发者一起加入研究与探讨;如发现文章访问错误、内容错误或版权疑问、内容有违相关法律(如涉及政治、色情、反动或散布虚假有害信息)等情况,请及时向我们举报,我们将及时纠正!
    联系邮箱:Shiny#vip.qq.com (#替换为@) QQ交流群: 40797788 [闽ICP备05014267号]
    百度