记得以前刚用的时候,webclient确实看着挺简单,但是实现起来,小文件是一下就下载完了.
大文件要一直下载完毕才行.
后来找了找,用 WebRequest 结合 WebResponse 可以实现 有进度提示的,下载文件..
下面是代码..是从我一个软件中提取出来的.只取关键部分说明...
=====================================================================
if(Downloading==false) //如果无文件正在下载
{
TempDown=CurrentFileName;
if(CurrentFileName==""){TempDown=b;}
WhichDown=1;
System.Threading.Thread ApcThread2=new System.Threading.Thread(new System.Threading.ThreadStart(DownFile));
ApcThread2.Start();
}
else
{
MessageBox.Show("对不起,当前正在下载文件.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
##################
大概说明下,如果当前没有文件正在下载,则启动一个新线程....下载文件.. 下面是 DownFile函数的代码....
简单的地方就不做注释了.
=============================================================================
//下载块#####################################################################################################
private void DownFile()
{
if(TempDown!="")
{
if(Downloading==false) //如果无文件下载
{
long fb;
this.apc_status_1.Text="正在连接到 " + TempDown;
Downloading=true;
try
{
//====尝试URL有效性,以及初始化下载界面
WebRequest myre=WebRequest.Create(TempDown);
WebResponse mwrite=myre.GetResponse();
fb=mwrite.ContentLength;
this.apc_status_1.Text="连接成功..开始下载..";
pbar.Value=0;
pbar.Maximum=(int)fb;
pbar.Visible=true;
this.ApcList.Height=156;
//====开始下载
WebClient wc=new WebClient();
SaveFileDialog sf=new SaveFileDialog();
sf.Title="请选择文件存放的位置";
filename=CurrentFileName;
sf.FileName=filename.Substring(filename.LastIndexOf("/")+1,filename.Length-filename.LastIndexOf("/")-1);
sf.ShowDialog(this);
filename=sf.FileName;
if(filename!="")
{
Stream srm=wc.OpenRead(TempDown);
StreamReader srmer=new StreamReader(srm);
byte[] mbyte=new byte[fb];
int allbyte=(int)mbyte.Length;
int startbyte=0;
while(fb>0) //################ 循环读取文件,并显示进度.....
{
Application.DoEvents();
int m=srm.Read(mbyte,startbyte,allbyte);
if(m==0){break;}
startbyte+=m;
allbyte-=m;
pbar.Value+=m;
int a1=(int)startbyte/1024;
int a2=(int)fb/1024;
this.apc_status_1.Text="连接成功..开始下载.." + a1.ToString() + "/" + a2.ToString() + "KB";//startbyte + "/" + fb.ToString();
}
FileStream fs = new FileStream(filename,FileMode.OpenOrCreate);
fs.Write(mbyte,0,mbyte.Length);
fs.Flush();
srm.Close();
srmer.Close();
fs.Close();
this.ApcList.Height=170;
pbar.Visible=false;
this.apc_status_1.Text="文件下载完毕!";
}
}
catch(WebException exp) //如地址无效或者找不到文件
{
MessageBox.Show(exp.Message,"听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
Downloading=false;
}
else
{
MessageBox.Show("对不起,当前正在下载文件.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
else
{
if(WhichDown==1)
{
MessageBox.Show("当前并无文件播放.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
else
{
MessageBox.Show("请在列表中选择好想要下载的文件.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
}//下载块#####################################################################################################