我有一个项目要做下载管理,我做了一个demo,然后遇到了一些下载管理方面的问题。
1. 但是在做暂停,重启的时候遇到了问题,特别是在我退出软件,然后重启之后如何继续下载。
2. 我得到的Stream不支持seek;(Stream str = client.OpenRead(URLAddress); )要不然我可以记录一下位置,然后Seek过去。
希望大家给点建议,有源码最好了。private void StartDownload()
{
WebClient client = new WebClient();
Start.BeginInvoke(new changeStaushandler(ChangeStaus));
//Start.Enabled = false;
string URL = srcAddress.Text;
int n = URL.LastIndexOf("/");
int m1 = URL.LastIndexOf("?");
if (m1 < 0)
{
m1 = URL.Length;
}
string URLAddress = URL;
string fileName = URL.Substring(n + 1, m1-n-1);
string Dir = tarAddress.Text;
string Path = Dir + "\\" + fileName+".tmp";
long size = 0;
long ChunkSize = 102400;
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)GetRequest(URLAddress).GetResponse();
size = response.ContentLength;
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, "Error");
} try
{
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "开始下载文件");
//statusBar.Text = "开始下载文件...";
//client.DownloadFile(URLAddress, fileName);
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
int startmbyte = 0;
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "正在接收数据");
//statusBar.Text = "正在接收数据...";
FileStream fstr = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);
fstr.Close();
while (size > 0)
{
fstr = new FileStream(Path, FileMode.Append, FileAccess.Write);
byte[] mbyte = new byte[ChunkSize];
//long seek = str.Seek(1000000, SeekOrigin.Current);
int lengthRead = str.Read(mbyte, 0,Convert.ToInt32(ChunkSize));
if (lengthRead == 0)
break;
fstr.Write(mbyte, startmbyte, lengthRead);
size -= lengthRead;
fstr.Close();
}
str.Close();
str.Flush();
client.Dispose();
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "下载完毕!");
//statusBar.Text = "下载完毕!";
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, "Error");
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "");
//statusBar.Text = "";
} Start.BeginInvoke(new changeStaushandler(ChangeStaus));
//Start.Enabled = true;
}
1. 但是在做暂停,重启的时候遇到了问题,特别是在我退出软件,然后重启之后如何继续下载。
2. 我得到的Stream不支持seek;(Stream str = client.OpenRead(URLAddress); )要不然我可以记录一下位置,然后Seek过去。
希望大家给点建议,有源码最好了。private void StartDownload()
{
WebClient client = new WebClient();
Start.BeginInvoke(new changeStaushandler(ChangeStaus));
//Start.Enabled = false;
string URL = srcAddress.Text;
int n = URL.LastIndexOf("/");
int m1 = URL.LastIndexOf("?");
if (m1 < 0)
{
m1 = URL.Length;
}
string URLAddress = URL;
string fileName = URL.Substring(n + 1, m1-n-1);
string Dir = tarAddress.Text;
string Path = Dir + "\\" + fileName+".tmp";
long size = 0;
long ChunkSize = 102400;
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)GetRequest(URLAddress).GetResponse();
size = response.ContentLength;
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, "Error");
} try
{
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "开始下载文件");
//statusBar.Text = "开始下载文件...";
//client.DownloadFile(URLAddress, fileName);
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
int startmbyte = 0;
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "正在接收数据");
//statusBar.Text = "正在接收数据...";
FileStream fstr = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);
fstr.Close();
while (size > 0)
{
fstr = new FileStream(Path, FileMode.Append, FileAccess.Write);
byte[] mbyte = new byte[ChunkSize];
//long seek = str.Seek(1000000, SeekOrigin.Current);
int lengthRead = str.Read(mbyte, 0,Convert.ToInt32(ChunkSize));
if (lengthRead == 0)
break;
fstr.Write(mbyte, startmbyte, lengthRead);
size -= lengthRead;
fstr.Close();
}
str.Close();
str.Flush();
client.Dispose();
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "下载完毕!");
//statusBar.Text = "下载完毕!";
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, "Error");
statusBar.BeginInvoke(new ChangeStausbarhandler(ChanageStausbar), "");
//statusBar.Text = "";
} Start.BeginInvoke(new changeStaushandler(ChangeStaus));
//Start.Enabled = true;
}
解决方案 »
- C#程序如何安全保存DES加密算法的key
- dispose()方法不作为
- 怎样对用命令写的文本框在运行时赋值,进行加法运算
- C# a继承b c继承b a与c怎么转换
- ViewState如何在类中使用
- 请教pda 红外通讯编程的问题
- 请问C#中如何设置坐标的映射模式?像C++中的SetMapMode一样?
- C# 动态创建按钮,怎么获得按钮事件 求帮助
- wince6.0下,.net不支持异步委托,用什么办法可以实现以下功能?
- 学了C#不知道什么是委托啊!相当于C++中的哪方面知识啊!
- Request.Cookies["Name"].Value发布后出错
- 请问,如何设置另外一个进程的SysDateTimePick32控件的日期?
这个能符合你的要求。