怎么实现下载 实现下载 暂停 又开始下载

0 篇文章 0 订阅
暂停下载需要服务器的支持。一些http服务器支持分块传输,否则无法实现。
原理是首先获得文件大小,在本地磁盘上建立同样大小的空白文件。然后分块从服务器中下载并填充它们,直到全部完成。

http://www.codeproject.com/Articles/21053/MyDownloader-A-Multi-thread-C-Segmented-Download-M

/// c#,.net 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// /// <param name="Filename">下载后的存放地址</param> /// <param name="Prog">用于显示的进度条</param> /// public void DownloadFile(string URL, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1) { float percent = 0; try { System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); long totalBytes = myrp.ContentLength; if (prog != null) { prog.Maximum = (int)totalBytes; } System.IO.Stream st = myrp.GetResponseStream(); System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create); long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { totalDownloadedByte = osize + totalDownloadedByte; System.Windows.Forms.Application.DoEvents(); so.Write(by, 0, osize); if (prog != null) { prog.Value = (int)totalDownloadedByte; } osize = st.Read(by, 0, (int)by.Length); percent = (float)totalDownloadedByte / (float)totalBytes * 100; label1.Text = "当前补丁下载进度" + percent.ToString() + "%"; System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息 } so.Close(); st.Close(); } catch (System.Exception) { throw; } } }}


暂停就是:
1、客户端记录当前下载位置;
2、客户端停止下载,关闭流;
3、服务器端会出现异常,没关系,结束发送线程就是了。

继续就是:
1、客户端请求发送文件,并给出起始位置;
2、服务器端读取文件,并从起始位置开始发送。   

so.Seek(0, SeekOrigin.Begin);//设置当前流的位置 跳过已经下载的

while (osize != (-1)&&isStop!=true) //isStop初始化为false,当我触发“暂停”按钮时执行isStop=true; 通过判断isStop的值来中断下载流。

http://download.csdn.net/detail/yes16ws/4124161

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libcurl提供了一些选项和回调函数,可以用于实现暂停和继续下载。具体来说,可以通过设置CURLOPT_WRITEFUNCTION选项和CURLOPT_WRITEDATA选项来控制接收到的数据的处理方式,然后在回调函数中添加暂停和继续下载的逻辑。 例如,可以设置一个全局变量或者结构体来控制下载的状态,并在回调函数中检查该变量的值来决定是否继续处理数据。当需要暂停下载时,将该变量的值设置为一个特定的标记,然后在回调函数中判断该标记是否已被设置。如果已经设置,就返回一个非零值,告诉libcurl停止传输数据,直到该变量被重新设置为其他值。当需要继续下载时,将该变量的值设置为其他值,再次调用curl_easy_perform()函数即可。 示例代码如下: ``` int transfer_paused = 0; FILE *fp = NULL; size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) { // check if transfer is paused if (transfer_paused) { return CURL_WRITEFUNC_PAUSE; } // write received data to file fwrite(ptr, size, nmemb, fp); return size * nmemb; } // pause transfer transfer_paused = 1; // resume transfer transfer_paused = 0; curl_easy_perform(curl); ``` 在这个示例中,当transfer_paused变量被设置为1时,回调函数write_callback()会返回CURL_WRITEFUNC_PAUSE来暂停下载。当该变量被设置为0时,回调函数将继续将数据写入文件。可以根据需要在其他地方设置和清除该变量的值,并在下载暂停和继续时调用curl_easy_perform()函数。另外,需要在设置CURLOPT_WRITEFUNCTION选项和CURLOPT_WRITEDATA选项之前,打开或创建一个文件,并将文件指针传递给CURLOPT_WRITEDATA选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值