您的位置:

C#下载文件

在C#编程中,下载文件是一种常见的任务。下载文件可以是从互联网上获取文件或从本地服务器上获取文件。无论使用哪种方法,我们都需要了解如何在C#代码中下载文件。以下是一个包含多种下载方法的详细讨论。

一、使用WebClient类进行下载

WebClient是一个用于发送数据的简单类,在C#编程中经常用于下载和上传文件。使用WebClient类下载文件非常简单,只需以下几步: 1. 引用System.Net命名空间。 2. 创建一个WebClient对象。 3. 调用DownloadFile方法,并提供要下载的文件的URL和本地文件的路径。 下面是一个示例代码:
using System.Net;

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        client.DownloadFile(url, localPath);
    }
}
在上面的例子中,首先创建了一个WebClient对象,然后通过调用DownloadFile方法将远程文件下载到本地。

二、使用HttpWebRequest类进行下载

HttpWebRequest是一个更底层的类,可以用于构建更复杂的HTTP请求,如设置请求头、发送POST数据等。使用HttpWebRequest下载文件需要以下几个步骤: 1. 引用System.Net命名空间。 2. 创建一个HttpWebRequest对象。 3. 调用GetResponse方法并获取响应流。 4. 将响应流写入本地文件。 下面是一个示例代码:
using System.Net;

class Program
{
    static void Main(string[] args)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/image.jpg");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        string localPath = @"C:\Downloads\image.jpg";
        using (FileStream fs = new FileStream(localPath, FileMode.CreateNew))
        {
            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                fs.Write(buffer, 0, bytesRead);
            }
        }
    }
}
在上面的例子中,创建一个HttpWebRequest对象,并调用GetResponse方法获取响应流。然后,我们将响应流读入缓冲区并将缓冲区写入本地文件。

三、使用HttpClient类进行下载

HttpClient是C# 5.0及更高版本中引入的新类,可以提供更好的性能和简化的API。使用HttpClient下载文件与使用WebClient类相似,只需提供文件的URL和本地路径。下面是一个示例代码:
using System.Net.Http;

class Program
{
    static async Task Main(string[] args)
    {
        HttpClient client = new HttpClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        HttpResponseMessage response = await client.GetAsync(url);
        using (Stream stream = await response.Content.ReadAsStreamAsync())
        using (FileStream fs = new FileStream(localPath, FileMode.CreateNew))
        {
            await stream.CopyToAsync(fs);
        }
    }
}
在上面的例子中,我们创建了一个HttpClient对象,并使用GetAsync方法获取响应。然后,我们将响应流读入缓冲区并将缓冲区写入本地文件。

四、下载文件时添加进度条

有时候,我们需要在下载文件时显示进度条,以便用户了解下载进度。我们可以使用WebClient或HttpClient类来实现这一点,同时跟踪downloadProgress事件。 下面是一个WebClient下载带有进度条的文件的示例代码:
using System.Net;

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        client.DownloadProgressChanged += (sender, e) =>
        {
            Console.WriteLine($"Downloaded {e.BytesReceived} of {e.TotalBytesToReceive} bytes. {e.ProgressPercentage}% complete.");
        };
        client.DownloadFileAsync(new Uri(url), localPath);
    }
}
在上面的代码中,我们绑定了DownloadProgressChanged事件,以跟踪下载的进度。当下载进度发生变化时,事件处理程序将被调用,并显示下载的字节数和已完成的百分比。 在HttpClient中,我们可以使用Progress 类来跟踪下载进度。下面是一个示例代码:
using System.Net.Http;

class Program
{
    static async Task Main(string[] args)
    {
        HttpClient client = new HttpClient();
        string url = "http://example.com/image.jpg";
        string localPath = @"C:\Downloads\image.jpg";
        var progress = new Progress<long>();
        progress.ProgressChanged += (sender, bytesDownloaded) =>
        {
            Console.WriteLine($"Downloaded {bytesDownloaded} bytes.");
        };
        await client.DownloadFileWithProgressAsync(url, localPath, progress);
    }
}

static class HttpClientExtensions
{
    public static async Task DownloadFileWithProgressAsync(this HttpClient client, string requestUri, string filePath, IProgress<long> progress = null)
    {
        using (HttpResponseMessage response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead))
        using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
        {
            string fileToWriteTo = filePath;
            string directoryName = Path.GetDirectoryName(fileToWriteTo);
            if (!Directory.Exists(directoryName))
            {
                Directory.CreateDirectory(directoryName);
            }
            using (Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create))
            {
                await streamToReadFrom.CopyToAsync(streamToWriteTo, 4096, progress);
            }
        }
    }
}
在上面的代码中,我们创建了一个名为progress的Progress<long>对象,并绑定了ProgressChanged事件以显示下载进度。DownloadFileWithProgressAsync方法接收一个名为progress的参数,以便我们与进度条交互。在方法内部,我们使用HttpResponseMessage获取响应流,并将其写入本地文件。