C#实现单个文件的下载已测试成功

### C#实现单个文件的下载技术解析 #### 一、引言 在现代软件开发中,文件的上传与下载是非常常见的功能需求之一。尤其是在Web应用程序中,用户往往需要从服务器下载各种类型的文件,如文档、图片、音频、视频等。C#作为一种广泛使用的面向对象编程语言,在.NET框架下提供了强大的网络编程能力,可以轻松实现文件的下载功能。 #### 二、技术背景 在C#中实现文件下载主要依赖于`System.Net`命名空间下的类库,其中包括了`HttpWebRequest`和`HttpWebResponse`这两个核心类。`HttpWebRequest`用于创建HTTP请求,而`HttpWebResponse`则负责处理HTTP响应。 #### 三、关键代码解析 ##### 3.1 下载文件函数DownFile ```csharp public static void DownFile(string URL, string Filename, ProgressBar Prog) { Prog.Visible = true; 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; 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 = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { totalDownloadedByte += osize; Application.DoEvents(); so.Write(by, 0, osize); Prog.Value = (int)totalDownloadedByte; osize = st.Read(by, 0, (int)by.Length); } so.Close(); st.Close(); Prog.Visible = false; } ``` **3.1.1 HttpWebRequest与HttpWebResponse** - **HttpWebRequest**: 用于创建一个HTTP请求。 - `System.Net.HttpWebRequest.Create(URL)`:根据URL创建一个HTTP请求对象。 - **HttpWebResponse**: 用于接收HTTP响应。 - `GetResponse()`:发送请求并获取响应。 **3.1.2 文件流操作** - `System.IO.FileStream`: 创建一个文件流对象,用于将数据写入指定的文件中。 - `new System.IO.FileStream(Filename, System.IO.FileMode.Create)`:创建一个新的文件流对象,如果文件不存在,则创建该文件;如果文件存在,则覆盖原有文件。 **3.1.3 数据读取与写入** - 使用缓冲区进行数据的读取和写入操作。 - `byte[] by = new byte[1024]`:定义一个字节数组作为缓冲区。 - `osize = st.Read(by, 0, (int)by.Length)`:从服务器响应流中读取数据到缓冲区。 - `so.Write(by, 0, osize)`:将缓冲区中的数据写入到文件流中。 **3.1.4 进度条更新** - 通过`ProgressBar`控件实时显示下载进度。 - `Prog.Maximum = (int)totalBytes`:设置进度条的最大值为文件总大小。 - `Prog.Value = (int)totalDownloadedByte`:根据已下载的字节数更新进度条当前值。 - `Application.DoEvents();`:更新UI界面。 ##### 3.2 触发下载按钮事件 ```csharp private void button1_Click(object sender, EventArgs e) { DownFile("http://58.242.29.70:1983/QQkj/ͬ.mp3", "D:\\ͬ.mp3", progressBar1); DownFile("http://www.lbzzhy.com/images/zzhk.mp3", "D:\\xxhk.mp3", progressBar2); // 下面是被注释掉的多文件下载示例 // DownFile("http://58.242.29.70:1983/QQkj/ͬ.mp3", "D:\\ͬ.mp3", progressBar3); // DownFile("http://58.242.29.70:1983/QQkj/ͬ.mp3", "D:\\ͬ.mp3", progressBar4); // DownFile("http://58.242.29.70:1983/QQkj/ͬ.mp3", "D:\\ͬ.mp3", progressBar5); } ``` **3.2.1 触发机制** - 在按钮点击事件中调用`DownFile`方法,传入具体的URL、保存路径以及进度条控件。 - 此处展示了两个文件的下载过程,可以通过注释部分了解如何实现多个文件的同时下载。 #### 四、总结 本篇技术解析主要介绍了如何使用C#实现单个文件的下载功能。通过对`HttpWebRequest`和`HttpWebResponse`类的应用,结合文件流的操作,实现了文件的高效下载。此外,通过进度条的实时更新,提高了用户体验。这种方法简单实用,适用于大多数Web应用项目中文件下载的需求场景。开发者可以根据实际需求调整代码逻辑,如增加错误处理、支持断点续传等功能,以满足更为复杂的业务需求。






























{
Prog.Visible = true;
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;
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 = new byte[1024];
int osize = st.Read(by, 0, (int)by.Length);
while (osize > 0)
{
totalDownloadedByte = osize + totalDownloadedByte;
Application.DoEvents();
so.Write(by, 0, osize);
Prog.Value = (int)totalDownloadedByte;
osize = st.Read(by, 0, (int)by.Length);
}
so.Close();
st.Close();
Prog.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
DownFile("http://58.242.29.70:1983/QQkj/同桌的你.mp3", "D:\\同桌的你.mp3", progressBar1);
DownFile("http://www.lbzzhy.com/images/zzhk.mp3", "D:\\xxhk.mp3", progressBar2);
//DownFile("http://58.242.29.70:1983/QQkj/同桌的你.mp3", "D:\\同桌的你.mp3", progressBar3);

- mengmeng_boy2012-10-19这是一本代码详尽的程序开发人员用书,大家可以看一下
- hecgaoyuan2014-06-17太简单了不过还是支持一下吧
- evolzq2015-04-18挺好的简单易懂可以用~~~

- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 轻松舞萌:基于 Uni-app 的舞萌数据集成查询 APP,适配安卓、IOS 与小程序
- 网络公开数据集的索引信息汇总
- 轻松 舞萌 ,基于Uni-app的舞萌(maimai)数据集成式查询APP,已适配安卓/IOS/小程序
- 形式化方法在软件工程中的应用与挑战
- 本案例聚焦微信文章与后台数据采集功能实现
- 关于数据集格式处理的相关脚本
- 实体关系抽取,使用了百度比赛的数据集 使用pytorch实现MultiHeadJointEntityRelationExtraction,包含Bert、Albert、gru的使用,并且添加了对抗训练
- 基于程序上下文的Python代码推荐.pdf
- 基于MATLAB的实时混合试验平台开发及验证.pdf
- 精通Oracle数据库架构与编程技巧
- 使用lvds对链路进行训练和对齐
- 基于 ESPhome 与 PZEM-004t 和 ESP 01/01S 的培正电表用电监测及 HomeAssistant 集成方案
- 培正电表用电监测,基于 ESPhome,使用 PZEM-004t 和 ESP 01/01S 将数据集成到 HomeAssistant
- Obsidian-1.9.10.exe
- 基于 PyTorch 的 MultiHead 联合实体关系抽取模型实现与部署:融合 Bert、Albert 和 GRU 并添加对抗训练,结合 Flask 与 Neo4j 图数据库
- 基于FPGA的FIR低通滤波器.pdf


