您的位置:首页 > 其它

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

2012-03-12 12:37 134 查看
暂停下载需要服务器的支持。一些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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: