进度条问题 如何获取某个线程的当前进度,并通过进度条展现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 backgroundWorker的ProgressChanged事件 to sdyqingdao : 你的意思是不是只能自己定一个假的,模拟一下。 to zhengshaodong就是没有办法获取到当前的进度。我的程序是实现写文件的功能,一次性写多个文件,文件数是可变的。这样怎么获取类似与(已下载的文件大小/文件的总大小)的大小呢? 参考代码片段 /// <summary> /// 开始下载 /// </summary> public void Start() { int splitRangeSize = 512; long downloadedRange = 0; FileStream fileStream; //未下载完毕前使用临时文件名 名字后缀加.!tmp string tempSavePath = this.savePath + ".!tmp"; //检查文件是否下载好了 如果已经下载完毕 则退出当前这个文件的下载 if (File.Exists(this.savePath)) { if (this.UpdateCompleted != null) { this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl)); } return; } //检查文件是否存在 存在则获取当前文件流的大小 if (File.Exists(tempSavePath)) { fileStream = File.OpenWrite(tempSavePath); downloadedRange = fileStream.Length; fileStream.Seek(downloadedRange, SeekOrigin.Current); } else { fileStream = new FileStream(tempSavePath, FileMode.Create); } //开始下载 try { HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(this.requestUrl); //如果当前文件已经下载了一部分,则向HttpWebRequest添加Range值 if (downloadedRange > 0) { httpRequest.AddRange((int)downloadedRange); } Stream tempStream = httpRequest.GetResponse().GetResponseStream(); byte[] tempBuffer = new byte[splitRangeSize]; int tempFsReadSize = 0; tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize); while (tempFsReadSize > 0) { fileStream.Write(tempBuffer, 0, tempFsReadSize); //下载一段后触发UpdateProgress事件 更新界面的进度信息 if (this.UpdateProgress != null) { this.UpdateProgress(this, new UpdateProgressEventArgs((int)fileStream.Length)); } System.Threading.Thread.Sleep(20); tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize); } tempStream.Close(); Console.WriteLine("下载完成"); fileStream.Close(); //下载完成后把临时文件名更改过来 File.Move(tempSavePath, this.savePath); if (this.UpdateCompleted != null) { this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl)); } } catch (Exception err) { if (err is WebException ) { if (this.UpdateHttpRequestError != null) { this.UpdateHttpRequestError(this, new EventArgs()); } if (this.UpdateCompleted != null) { this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl)); } } Console.WriteLine("下载过程出现错误:" + err.ToString()); fileStream.Close(); } } class UpdateProgressEventArgs : EventArgs { private int progressValue; public UpdateProgressEventArgs(int progressValue) { this.progressValue = progressValue; } public int ProgressValue { get { return this.progressValue; } }}class UpdateRequest { #region 事件 //文件下载完毕运行的委托事件 public delegate void UpdateCompletedEventHandler(object sender, UpdateCompletedEventArgs e); public event UpdateCompletedEventHandler UpdateCompleted; //文件下载中更新进度的委托事件 public delegate void UpdateProgressEventHandler(object sender, UpdateProgressEventArgs e); public event UpdateProgressEventHandler UpdateProgress; //请求远程服务器出错的委托事件 public delegate void UpdateHttpRequestErrorEventHandler(object sender, EventArgs e); public event UpdateHttpRequestErrorEventHandler UpdateHttpRequestError;}全部代码有几个 以前做的 大概思路就是这样吧 好象问题已经解决了....学习下 其实我做的时候 都是根据文件的个数来判断的也就是 以传个数/总个数 =value 总个数 是最大值然后timer 定时 刷一下进度...我是小菜鸟! 说的不好清见谅, 希望能够帮到你! 为什么 IBatis.net 会把 statements id 当成存储过程名? c# 去除字符串中重复的字符 无法加载 DLL 找不到指定的模块 c#调用EXCEL进行文件保存的问题 水晶报表,点击查询后不刷新 我想在tabcontrol中的一个page上动态添加几个按钮,并设置按钮的名字和位置,还有按钮的事件 如何做 在Sqlserver中使用中文列名合适吗? 请问哪有水晶报表8或9下载? 关于ArrayList类的一个奇怪问题! 如何截取系统消息,监视文件和注册表的变化? 关于 .NET 数据库的问题 关于滚动条
你的意思是不是只能自己定一个假的,模拟一下。
就是没有办法获取到当前的进度。我的程序是实现写文件的功能,一次性写多个文件,文件数是可变的。这样怎么获取类似与(已下载的文件大小/文件的总大小)的大小呢?
/// 开始下载
/// </summary>
public void Start()
{
int splitRangeSize = 512;
long downloadedRange = 0;
FileStream fileStream;
//未下载完毕前使用临时文件名 名字后缀加.!tmp
string tempSavePath = this.savePath + ".!tmp";
//检查文件是否下载好了 如果已经下载完毕 则退出当前这个文件的下载
if (File.Exists(this.savePath))
{
if (this.UpdateCompleted != null)
{
this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
}
return;
} //检查文件是否存在 存在则获取当前文件流的大小
if (File.Exists(tempSavePath))
{
fileStream = File.OpenWrite(tempSavePath);
downloadedRange = fileStream.Length;
fileStream.Seek(downloadedRange, SeekOrigin.Current);
}
else
{
fileStream = new FileStream(tempSavePath, FileMode.Create);
} //开始下载
try
{
HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(this.requestUrl);
//如果当前文件已经下载了一部分,则向HttpWebRequest添加Range值
if (downloadedRange > 0)
{
httpRequest.AddRange((int)downloadedRange);
}
Stream tempStream = httpRequest.GetResponse().GetResponseStream();
byte[] tempBuffer = new byte[splitRangeSize];
int tempFsReadSize = 0;
tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize);
while (tempFsReadSize > 0)
{
fileStream.Write(tempBuffer, 0, tempFsReadSize);
//下载一段后触发UpdateProgress事件 更新界面的进度信息
if (this.UpdateProgress != null)
{
this.UpdateProgress(this, new UpdateProgressEventArgs((int)fileStream.Length));
}
System.Threading.Thread.Sleep(20);
tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize);
}
tempStream.Close();
Console.WriteLine("下载完成");
fileStream.Close();
//下载完成后把临时文件名更改过来
File.Move(tempSavePath, this.savePath); if (this.UpdateCompleted != null)
{
this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
}
}
catch (Exception err)
{
if (err is WebException )
{
if (this.UpdateHttpRequestError != null)
{
this.UpdateHttpRequestError(this, new EventArgs());
}
if (this.UpdateCompleted != null)
{
this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
}
}
Console.WriteLine("下载过程出现错误:" + err.ToString());
fileStream.Close();
}
}
class UpdateProgressEventArgs : EventArgs
{
private int progressValue; public UpdateProgressEventArgs(int progressValue)
{
this.progressValue = progressValue;
} public int ProgressValue
{
get
{
return this.progressValue;
}
}
}
class UpdateRequest
{
#region 事件
//文件下载完毕运行的委托事件
public delegate void UpdateCompletedEventHandler(object sender, UpdateCompletedEventArgs e);
public event UpdateCompletedEventHandler UpdateCompleted;
//文件下载中更新进度的委托事件
public delegate void UpdateProgressEventHandler(object sender, UpdateProgressEventArgs e);
public event UpdateProgressEventHandler UpdateProgress;
//请求远程服务器出错的委托事件
public delegate void UpdateHttpRequestErrorEventHandler(object sender, EventArgs e);
public event UpdateHttpRequestErrorEventHandler UpdateHttpRequestError;
}全部代码有几个 以前做的 大概思路就是这样吧
也就是 以传个数/总个数 =value 总个数 是最大值然后timer 定时 刷一下进度...
我是小菜鸟! 说的不好清见谅, 希望能够帮到你!