断点续传其实就是在请求流的时候请求中间流,而不是每次重新从头来过
HttpWebRequest Myrq = (HttpWebRequest)HttpWebRequest.CreateHttp(URL);
Myrq.Headers["Range"] = "bytes=1024-";//设置Range值这句就是请求1024位置开始到末尾的流
如果Myrq.Headers["Range"] = "bytes=1024-2048"; 则表示请求1024到2048位置的数据 有了这个方法,写断点续传就会简单许多了,错略的方法如下
public
void DownFile(string URL, string Filename, ProgressBar Prog){ //打开上次下载的文件或新建文件long lStartPos = 0;IsolatedStorageFileStream fs;if (IsolatedStorageFile.GetUserStoreForApplication().FileExists(Filename)){ fs = IsolatedStorageFile.GetUserStoreForApplication().OpenFile(Filename, FileMode.Open);lStartPos = fs.Length;fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针}else{ fs = IsolatedStorageFile.GetUserStoreForApplication().CreateFile(Filename);lStartPos = 0;}try
{ HttpWebRequest Myrq = (HttpWebRequest)HttpWebRequest.CreateHttp(URL);Myrq.Headers["User-Agent"] = “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)”;if (lStartPos > 0){ Myrq.Headers["Range"] = “bytes=” + lStartPos + “-”;//设置Range值}Myrq.BeginGetResponse(newAsyncCallback((a) =>{ var myrp = Myrq.EndGetResponse(a);long totalBytes = myrp.ContentLength + fs.Length;this.Dispatcher.BeginInvoke(() => { Prog.Maximum = (int)totalBytes; });Stream st = myrp.GetResponseStream();//Stream so = new FileStream(Filename, FileMode.Create);long totalDownloadedByte = fs.Length;byte[] by = newbyte[1024];int osize = st.Read(by, 0, (int)by.Length);while (osize > 0){ totalDownloadedByte = osize + totalDownloadedByte;fs.Write(by, 0, osize);this.Dispatcher.BeginInvoke(() => { Prog.Value = (int)totalDownloadedByte; });osize = st.Read(by, 0, (int)by.Length);}fs.Close();st.Close();MessageBox.Show(“下载完毕!”);}), null);}catch (Exception ex){ MessageBox.Show(“提示“ + ex.Message);}}