### 下载程序C#源码知识点解析 #### 一、概览 本文将对一个用于文件下载的C#源码进行详细分析,该程序具备基本的下载功能,并且支持断点续传。根据给定的文件信息,我们将重点探讨如何通过`Downfile`类实现普通下载和断点续传两种不同的下载模式,以及如何使用`writeLog`类来记录异常和错误日志。 #### 二、Downfile 类详解 `Downfile`类是整个程序的核心部分,它提供了两种下载方式:普通下载(`Work`方法)和断点续传(`ContinueWork`方法)。 ##### 2.1 构造函数 `Downfile`类提供了两个构造函数,用于初始化下载所需的参数: - **构造函数1**: ```csharp public Downfile(string url, string username, string userpwd, string savename, string proxyip, string proxyport) ``` - `url`:下载文件的URL。 - `username`:如果服务器需要认证,则提供用户名。 - `userpwd`:如果服务器需要认证,则提供密码。 - `savename`:保存文件的本地路径及名称。 - `proxyip`:代理服务器的IP地址。 - `proxyport`:代理服务器的端口号。 - **构造函数2**: ```csharp public Downfile(string url, string username, string userpwd, string savename) ``` - 此构造函数与第一个相似,但不包含代理服务器的信息。 ##### 2.2 Work 方法 `Work`方法实现了普通下载的功能,即无论目标文件是否已经存在都会重新下载整个文件。 1. **创建请求**:使用`HttpWebRequest`对象创建HTTP请求。 2. **设置代理**:如果提供了代理服务器的信息,则会设置代理。 3. **设置认证信息**:如果服务器需要认证,则设置用户名和密码。 4. **获取响应**:发送请求并获取`WebResponse`对象。 5. **读取流**:从响应中读取数据流,并将其写入本地文件。 ##### 2.3 ContinueWork 方法 `ContinueWork`方法实现了断点续传的功能,即如果文件已经部分下载,则可以从上次中断的位置继续下载剩余部分。 1. **检查文件是否存在**:如果文件不存在,则调用`Work`方法进行普通下载。 2. **获取已下载部分的长度**:如果文件存在,则获取已下载部分的长度。 3. **设置范围**:在HTTP请求中设置`Range`头,指定从哪个字节位置开始下载。 4. **处理异常**:当发生异常时,使用`writeLog`类记录异常信息。 #### 三、writeLog 类 `writeLog`类用于记录程序运行过程中的异常和错误信息。该类包含一个静态方法`LogWrite`,可以将异常信息写入日志文件。 ```csharp public static void LogWrite(string message) { // 实现将message写入日志文件的逻辑 } ``` ### 四、总结 该C#程序通过`Downfile`类实现了两种下载模式,能够满足不同场景的需求。对于普通下载,不论文件是否存在都会重新下载;对于断点续传,则能够在文件已部分下载的情况下继续下载剩余部分,提高了下载效率。此外,`writeLog`类确保了异常信息能够被记录下来,便于后续的问题排查和优化。
{
public Downfile(string url,string username,string userpwd,string savename,string proxyip,string proxyport)
{
Durl = url;
Dusername = username;
Duserpwd = userpwd;
Dsavename = savename;
Dproxyip = proxyip;
Dproxyport = proxyport;
}
public Downfile(string url, string username, string userpwd, string savename)
{
Durl = url;
Dusername = username;
Duserpwd = userpwd;
Dsavename = savename;
}
public void Work()//download file no matter the file is exist or not
{
try
{
Uri uri = new Uri(Durl);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
if (!(string.IsNullOrEmpty(Dproxyip) || string.IsNullOrEmpty(Dproxyport)))
{
WebProxy myproxy = new WebProxy(Dproxyip, Convert.ToInt32(Dproxyport));
request.Proxy = myproxy;
}
NetworkCredential credentials = new NetworkCredential(Dusername, Duserpwd);
request.Credentials = credentials;
WebResponse v = request.GetResponse();
Stream rStream = v.GetResponseStream();
byte[] buffer = new byte[4096];
Stream outStream = File.Create(Dsavename);
int len;
do
{
len = rStream.Read(buffer, 0, buffer.Length);
if (len > 0)
outStream.Write(buffer, 0, len);
} while (len > 0);
outStream.Close();
rStream.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\n");
if (WriteLog.LOgIsFine())
剩余5页未读,继续阅读
- Ci昵称Void2015-02-25谢谢分享,有一定的参考价值
- 粉丝: 89
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助