2011-08-27 238 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的任何值,只要它們是整數 我們不能在一行中任何鑄造組合解決這個