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获取响应流,并将其写入本地文件。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/303437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-31 11:49
下一篇 2024-12-31 11:49

相关推荐

  • vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常问题的解决

    本文旨在解决vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常的问题,提供完整的代码示例供参考。 一、分析问题 首先,需了解vue中下载文件的情况。一般情况下,我们…

    编程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • Python程序文件的拓展

    Python是一门功能丰富、易于学习、可读性高的编程语言。Python程序文件通常以.py为文件拓展名,被广泛应用于各种领域,包括Web开发、机器学习、科学计算等。为了更好地发挥P…

    编程 2025-04-29
  • 为什么用cmd运行Java时需要在文件内打开cmd为中心

    在Java开发中,我们经常会使用cmd在命令行窗口运行程序。然而,有时候我们会发现,在运行Java程序时,需要在文件内打开cmd为中心,这让很多开发者感到疑惑,那么,为什么会出现这…

    编程 2025-04-29
  • Python中读入csv文件数据的方法用法介绍

    csv是一种常见的数据格式,通常用于存储小型数据集。Python作为一种广泛流行的编程语言,内置了许多操作csv文件的库。本文将从多个方面详细介绍Python读入csv文件的方法。…

    编程 2025-04-29
  • Python将矩阵存为CSV文件

    CSV文件是一种通用的文件格式,在统计学和计算机科学中非常常见,一些数据分析工具如Microsoft Excel,Google Sheets等都支持读取CSV文件。Python内置…

    编程 2025-04-29
  • Python zipfile解压文件乱码处理

    本文主要介绍如何在Python中使用zipfile进行文件解压的处理,同时详细讨论在解压文件时可能出现的乱码问题的各种解决办法。 一、zipfile解压文件乱码问题的根本原因 在P…

    编程 2025-04-29
  • Python如何导入py文件

    Python是一种开源的高级编程语言,因其易学易用和强大的生态系统而备受青睐。Python的import语句可以帮助用户将一个模块中的代码导入到另一个模块中,从而实现代码的重用。本…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • Python写文件a

    Python语言是一种功能强大、易于学习、通用并且高级编程语言,它具有许多优点,其中之一就是能够轻松地进行文件操作。文件操作在各种编程中都占有重要的位置,Python作为开发人员常…

    编程 2025-04-29

发表回复

登录后才能评论