前言
軟件開發中,文件下載功能是許多應用程序的常見需求。對于用戶而言,不僅希望下載過程穩定高效,還希望能夠實時掌握下載進度,從而提升用戶體驗。而使用 C# .NET 開發的 WinForm 應用程序,我們可以通過簡單的代碼實現文件下載,并結合進度條(ProgressBar
)和標簽(Label
)來動態顯示下載狀態。
本文將以一段實際實現的代碼為基礎,詳細講解如何在 WinForm 中實現文件下載及進度條展示功能。
正文
整體邏輯
該代碼段的核心函數是 DownloadFile()
方法,它實現了從指定 URL 下載文件到本地路徑的功能,并通過進度條和標簽控件實時更新下載進度。
主要流程如下:
1、創建 HTTP 請求獲取遠程文件;
2、獲取文件總大小以設置進度條最大值;
3、創建本地文件流用于寫入數據;
4、使用循環讀取網絡流中的數據塊,并寫入本地文件;
5、實時計算并更新下載百分比與進度條;
6、異常處理以確保程序穩定性。
代碼結構
1、界面部分
界面由一個按鈕 btnDown_Click
觸發下載事件。
當點擊按鈕后,會調用 DownloadFile()
方法,傳入下載地址、保存路徑、進度條控件和標簽控件作為參數。
private void btnDown_Click(object sender, EventArgs e)
{
DownloadFile("http://localhost:1928/WebServer/downloader/123.rar", @"C:\123.rar", progressBar1, label1);
}
注意:上傳路徑為 "C:\123.rar"
,注意路徑是否正確以及是否有寫權限。
2、下載方法
public void DownloadFile(string URL, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
{
float percent = 0;
try
{
// 創建HTTP請求對象
System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
// 獲取文件總大小
long totalBytes = myrp.ContentLength;
// 設置進度條最大值
if (prog != null)
{
prog.Maximum = (int)totalBytes;
}
// 獲取響應流和創建文件流
System.IO.Stream st = myrp.GetResponseStream();
System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
long totalDownloadedByte = 0;
byte[] by = newbyte[1024];
int osize = st.Read(by, 0, (int)by.Length);
// 循環讀取并寫入文件
while (osize > 0)
{
totalDownloadedByte += osize;
so.Write(by, 0, osize);
// 更新進度條和標簽
if (prog != null)
{
prog.Value = (int)totalDownloadedByte;
}
percent = (float)totalDownloadedByte / (float)totalBytes * 100;
label1.Text = "當前補丁下載進度:" + percent.ToString("#0.00") + "%";
// 刷新UI
System.Windows.Forms.Application.DoEvents();
// 繼續讀取下一塊數據
osize = st.Read(by, 0, (int)by.Length);
}
// 關閉流
so.Close();
st.Close();
}
catch (Exception ex)
{
MessageBox.Show("下載過程中發生錯誤:" + ex.Message);
}
}
關鍵技術
1、多線程問題與 UI 阻塞
由于是直接在主線程中進行網絡下載操作,若不及時刷新界面,會導致 UI 卡頓甚至“無響應”。因此,代碼中使用了:
System.Windows.Forms.Application.DoEvents();
此方法允許在下載循環過程中接收和處理 Windows 消息,從而保持界面響應。
?? 注意:雖然 DoEvents()
可以暫時解決問題,但在大型項目或復雜場景中更推薦使用后臺線程(如 BackgroundWorker
或 async/await
異步編程模型)來避免阻塞主線程。
2、下載速度與緩沖區大小
本例中使用的緩沖區大小為 1KB(1024 字節),這個數值可以根據實際情況調整。
較大的緩沖區可以提高吞吐量,但也會增加內存占用。
例如改為 8KB:
byte[] by = new byte[8192]; // 更改緩沖區大小
3、進度計算與格式化顯示
通過比較已下載字節數與總字節數,計算出百分比:
percent = (float)totalDownloadedByte / (float)totalBytes * 100;
label1.Text = "當前補丁下載進度:" + percent.ToString("#0.00") + "%";
其中使用了格式字符串 #0.00
來保留兩位小數,使顯示更美觀。
總結
本文通過完整的WinForm代碼實現文件下載,深入講解了如何實現下載功能并配合控件實時顯示進度。整個過程簡潔有效,適用于小型工具類應用。
作者:小小工具箱
出處:blog.csdn.net/m0_62355555/article/details/126777817
該文章在 2025/5/10 10:30:44 編輯過