2011-08-27 242 views
7

我正在使用webclient来dowlnoad文件。我正在计算进度百分比如下计算进度百分比

  1. 我知道将要下载的文件的文件大小(我从数据库表中读取)。

  2. 我依赖于WebClient的BytesRecieved属性来知道在下载过程中获取的总字节数。

  3. 我使用的算法是double dProgress = (e.BytesReceived/FileSize)*100);来计算进度百分比。

但是我没有得到正确的进度百分比来更新进度栏。

是否有任何方法来计算进度百分比?

+0

你有什么代码? –

+0

对不起,我没有得到你刚刚告诉的。 – logeeks

+1

你怎么知道这是错的?它总是一样吗? 0?喃? > 100?负?确切的问题是什么? – Cameron

回答

17

看看下面的一行: double dProgress = (e.BytesReceived/FileSize)*100)

如果同时e.BytesReceivedFileSize是整数,那么你将永远有0 * 100 = 0

使事情是这样的:

double dProgress = ((double)e.BytesReceived/FileSize)*100.0

这是因为/做整数除法将两个整数的时候。但你不想那样。所以你将其中一个变量转换为double

+0

我用你的代码,发现代码正确生成。但是进度条仅填充四分之一。我使用的最小值为1,最大值为100.最小步长为0.1,最大步长为1.0.any想法? – logeeks

1

,并与BytesReceived最文件大小大概为整数,所以你需要计算的进展是这样的:

double dProgress = 100.0 * e.BytesReceived/FileSize; 
1

的问题是,这两个数字都是整数。当你devide他们,他们变得比1小,因此他们本轮下跌到0强制转换他们做出结果的浮动:

double dProgress = ((double)e.BytesReceived/FileSize)*100) 
3

如果你正在做一个异步下载,事件参数时处理DownloadProgressChanged事件已经有一个ProgressPercentage,所以没有重新发明它的意义。一个人为的例子:

var client = new WebClient(); 
var reset = new ManualResetEvent(false); 
client.DownloadProgressChanged += (s, e) => Console.WriteLine("{0} percent complete", e.ProgressPercentage); 
client.DownloadFileCompleted += (s, e) => reset.Set(); 
client.DownloadFileAsync(new Uri("http://myfilepathhere.com"), "file.name"); 
//Block till download completes 
reset.WaitOne(); 
+0

+ 1,伟大的作品:) –

+0

我越来越e.Progresspercentage始终为0,所以我寻找替代方法 – logeeks

0

试试这个:

WebClient Client = new WebClient(); 
Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 

...

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 

      double bytesIn = double.Parse(e.BytesReceived.ToString()); 
      double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
      double percentage = bytesIn/totalBytes * 100; 
      int percente = int.Parse(Math.Truncate(percentage).ToString()); 
      progressBar.Value = percente; 
     } 

或者只是使用ProgressPercentage值。

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 
      progressBar.Value = e.ProgressPercentage; 
    } 
+2

我知道我一年半迟了,但我必须回应这一点。这是** double.Parse(e.BytesReceived.ToString())**拖动或者你不知道什么是类型转换? – mnn

1

这是一个非常棘手的问题,在C#中进行基本的算术运算和转换。

解决方案

首先将整数除法的结果存储在双变量中。然后键入将其转换为整数。

int x = 5, y = 10, answer; 
double ansDouble; 
answer = (int)(x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

answer = (int)(x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

ansDouble = ((double)x/y) * 100; 
answer = (int)ansDouble; 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=50 

注意要点

原来,X/Y = 0时,x和y的任何值,只要它们是整数 我们不能在一行中任何铸造组合解决这个