我也很想知道,问了许多人,都说在VB下要想能得到下载文件的进度,只有直接用Winsock编程。

解决方案 »

  1.   

    可是Winsock不能下载Exe文件,下载其他的 如RAR的可以,Exe文件下载下来以后就被破坏了,不能正常使用了!
      

  2.   

    可是Winsock不能下载Exe文件,下载其他的 如RAR的可以,Exe文件下载下来以后就被破坏了,不能正常使用了!
      

  3.   

    用  Inet 下载文件.用  Inet1.execute url,"size myfile.exe"
    size 是返回目标文件大小的命令.用一个timer控件.每隔一秒检查一下缓冲区内的数据.
    在开始下载的时候,
    timer1.enabled=true在 timer1_timer()事件里, 用  getchunk方法读取 当前缓冲区的数据. 
    将数据长度存到一个变量  my_file_len里.  
    每隔一秒检查缓冲区的数据,如果数据比 my_file_len还要长.说明已有新数据被下载回来.  那么,  right(current_file,current_file_len - my_file_len)
    就是新下载回来的数据了.   你再根据比例.  就可以求出当前的进度了.具体的代码. 你自己写吧. 
    my_file_len变量,是上回读取时,缓冲区数据的长度.
    current_file 是当前缓冲区内的数据.
    current_file_len 是当前缓冲区内的数据.
      

  4.   

    我靠~!~!
    什么破论坛啊.
    好多回了.
    我辛苦回完了贴子.却回复的时候出现错误.
    我还要重打啊???????????????????????????????????????????????
    新技术新技术.   用的好些再拿出来也行啊~! K~~回复: 用 Inet 可以实现.原理无非是取得当前数据的大小.还有文件原来大小.
    文件原来大小用   inet1.execute url,"size myfile.exe"  来取得.
    当前数据大小.    用inet1.getchunk 方法,得到缓冲区的数据.再 len一下.
                    和原文件大小一坐对比.   OK了.MD,还是先复制一遍.再发表.安全些.
      

  5.   

    搞定了,,,费了劲了给分吧!
    Dim LastTextBox As TextBoxDim TotalLength As Long
    Dim Step As SinglePrivate Sub Command1_Click()
    Dim File() As Byte
        File() = Inet1.OpenURL(Text1.Text, icByteArray)
        Open "C:\1.zip" For Binary Access Write As #1
        Put #1, , File()
        Close #1
        MsgBox "Success"
    End SubPrivate Sub Command2_Click()
        Inet1.Execute Text1.Text, "GET"
    End SubPrivate Sub Form_Load()
        Text1.Text = "http://www14.brinkster.com/weblover/media2db.zip"
    End SubPrivate Sub Inet1_StateChanged(ByVal State As Integer)
    Dim vtData() As Byte '数据变量。
    Dim Count As Long
        Select Case State
            Case icHostResolvingHost
                Label1.Caption = "正在查询所指定的主机的 IP 地址"
            Case icHostResolved
                Label1.Caption = "成功地找到所指定的主机的 IP 地址"
            Case icConnecting
                Label1.Caption = "正在与主机连接"
            Case icConnected
                Label1.Caption = "已与主机连接成功"
            Case icRequesting
                Label1.Caption = "正在向主机发送请求"
            Case icRequestSent
                Label1.Caption = "发送请求已成功"
            Case icReceivingResponse
                Label1.Caption = "在接收主机的响应"
            Case icResponseReceived
                Label1.Caption = "成功地接收到主机的响应"
            Case icDisconnecting
                Label1.Caption = "正在解除与主机的连接"
            Case icDisconnected
                Label1.Caption = "已成功地与主机解除了连接"
            Case icError
                Label1.Caption = "与主机通讯时出现了错误"
            Case icResponseCompleted '12
                
                TotalLength = Val(Inet1.GetHeader("Content-length"))
                Step = (Me.ScaleWidth - Picture1.Left * 2) / TotalLength
                Debug.Print Step
                Label1.Caption = "请求已经完成,并且所有数据均已接收到"
                Open "C:\1.zip" For Binary Access Write As #1
                vtData = Inet1.GetChunk(1024, icByteArray)
                Count = 1000
                Picture1.Width = Picture1.Width + Count * Step
                Label1.Caption = "" & Round(Count * 1000 / TotalLength, 0) & "%"
                'Me.Refresh
                Do While UBound(vtData) > 0
                   Put #1, , vtData
                   vtData = Inet1.GetChunk(1024, icByteArray)
                   Picture1.Width = Picture1.Width + 1024 * Step
                   Count = Count + 1024
                   Label2.Caption = "" & Round(Count * 100 / TotalLength, 0) & "%"
                Loop
                Put #1, , vtData
                Close #1
                Label2.Caption = "100%"
                MsgBox "下载完成"
       End Select
    End Sub
      

  6.   

    我靠~!~!
    什么破论坛啊.
    好多回了.
    我辛苦回完了贴子.却回复的时候出现错误.
    我还要重打啊???????????????????????????????????????????????
    新技术新技术.   用的好些再拿出来也行啊~! K~~回复: 用 Inet 可以实现.原理无非是取得当前数据的大小.还有文件原来大小.
    文件原来大小用   inet1.execute url,"size myfile.exe"  来取得.
    当前数据大小.    用inet1.getchunk 方法,得到缓冲区的数据.再 len一下.
                    和原文件大小一坐对比.   OK了.MD,还是先复制一遍.再发表.安全些.
      

  7.   

    搞定了,,,费了劲了给分吧!
    Dim LastTextBox As TextBoxDim TotalLength As Long
    Dim Step As SinglePrivate Sub Command1_Click()
    Dim File() As Byte
        File() = Inet1.OpenURL(Text1.Text, icByteArray)
        Open "C:\1.zip" For Binary Access Write As #1
        Put #1, , File()
        Close #1
        MsgBox "Success"
    End SubPrivate Sub Command2_Click()
        Inet1.Execute Text1.Text, "GET"
    End SubPrivate Sub Form_Load()
        Text1.Text = "http://www14.brinkster.com/weblover/media2db.zip"
    End SubPrivate Sub Inet1_StateChanged(ByVal State As Integer)
    Dim vtData() As Byte '数据变量。
    Dim Count As Long
        Select Case State
            Case icHostResolvingHost
                Label1.Caption = "正在查询所指定的主机的 IP 地址"
            Case icHostResolved
                Label1.Caption = "成功地找到所指定的主机的 IP 地址"
            Case icConnecting
                Label1.Caption = "正在与主机连接"
            Case icConnected
                Label1.Caption = "已与主机连接成功"
            Case icRequesting
                Label1.Caption = "正在向主机发送请求"
            Case icRequestSent
                Label1.Caption = "发送请求已成功"
            Case icReceivingResponse
                Label1.Caption = "在接收主机的响应"
            Case icResponseReceived
                Label1.Caption = "成功地接收到主机的响应"
            Case icDisconnecting
                Label1.Caption = "正在解除与主机的连接"
            Case icDisconnected
                Label1.Caption = "已成功地与主机解除了连接"
            Case icError
                Label1.Caption = "与主机通讯时出现了错误"
            Case icResponseCompleted '12
                
                TotalLength = Val(Inet1.GetHeader("Content-length"))
                Step = (Me.ScaleWidth - Picture1.Left * 2) / TotalLength
                Debug.Print Step
                Label1.Caption = "请求已经完成,并且所有数据均已接收到"
                Open "C:\1.zip" For Binary Access Write As #1
                vtData = Inet1.GetChunk(1024, icByteArray)
                Count = 1000
                Picture1.Width = Picture1.Width + Count * Step
                Label1.Caption = "" & Round(Count * 1000 / TotalLength, 0) & "%"
                'Me.Refresh
                Do While UBound(vtData) > 0
                   Put #1, , vtData
                   vtData = Inet1.GetChunk(1024, icByteArray)
                   Picture1.Width = Picture1.Width + 1024 * Step
                   Count = Count + 1024
                   Label2.Caption = "" & Round(Count * 100 / TotalLength, 0) & "%"
                Loop
                Put #1, , vtData
                Close #1
                Label2.Caption = "100%"
                MsgBox "下载完成"
       End Select
    End Sub
      

  8.   

    这好象是不可能的。RAR 和 EXE 都是二进制文件。应该是你代码没写好吧。你代码下载的 RAR 应该也是坏的,但WINRAR功能强大,还是识别出来了。但WINDOWS却没有那么聪明。请你下载一个比较复杂的TXT然后比较一下原来的和已下载的试试看。
      

  9.   

    嘿嘿~!~!~我楼下的朋友.   state状态值等于  12的时候.
    是文件全部下载完成的时候.而你在那里放上代码.  文件都被下载完了.  你还处理什么进度啊?主要是用 timer控件定时检查缓冲区内的数据长度变化.   与得到的文件长度
    做对比.才出来的当前下载进度.
      

  10.   

    griefforyou(为你伤心)  你好,你的程序我测试过了,下载可以实现,但进度还是不能显示,因为Inet1.Execute Text1.Text, "GET"必须用FTP形式才可以使用,HTTP是不可是这样的用的!Inet1.Url = "服务器"
    Inet1.Username  = "用户名"
    Inet1.Password = "用户密码"
    Inet1.Execute Text1.Text, "GET"但是 我要强调的是,坚决不能用FTP下载,必须用HTTP形式下载不过我还是要很感谢您的!其它朋友,怎么样?