首页 > 编程语言 >基于C#的高效大文件下载器

基于C#的高效大文件下载器

时间:2024-08-19 21:25:42浏览次数:13  
标签:文件 高效 读取 C# new using bytesRead 下载

以下方法的优势:

  1. 高效性:采用HttpClient进行异步请求,减少了线程阻塞,提高下载速度,使用缓冲区分块读取和写入文件,避免一次性加载整个文件,节省内存。
  2. 提升用户体验:实时输出下载进度,用户可以清楚地了解下载的状态,提升用户体验。
  3. 支持大文件下载:将下载功能封装在静态方法中,便于在不同项目或场景中重复使用。
using System; // 引入基础功能的命名空间
using System.Net.Http; // 引入处理HTTP请求的命名空间
using System.Threading.Tasks; // 引入处理异步任务的命名空间
using System.IO; // 引入处理文件输入输出的命名空间

public class FileDownloader
{
    // 静态HttpClient实例,用于发起HTTP请求,避免多次创建带来的开销
    private static readonly HttpClient httpClient = new HttpClient();

    // 异步方法,用于下载文件,接受URL和目标路径作为参数
    public static async Task DownloadFileAsync(string url, string destinationPath)
    {
        // 检查URL是否为空或只包含空白字符,如果是则抛出异常
        if (string.IsNullOrWhiteSpace(url))
            throw new ArgumentException("URL 不能为 null 或空", nameof(url));

        // 检查目标路径是否为空或只包含空白字符,如果是则抛出异常
        if (string.IsNullOrWhiteSpace(destinationPath))
            throw new ArgumentException("目标路径不能为 null 或为空", nameof(destinationPath));

        try
        {
            // 发送GET请求以获取指定URL的响应,设置为只读取响应头
            using (HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
            {
                // 确保响应是成功的状态码
                response.EnsureSuccessStatusCode();

                // 获取文件的总大小,以便进行切片下载
                long totalBytes = response.Content.Headers.ContentLength ?? -1;
                const int bufferSize = 8192; // 定义缓冲区大小为8KB
                byte[] buffer = new byte[bufferSize]; // 创建缓冲区以存储下载的数据

                // 使用FileStream异步创建文件流并写入文件
                using (Stream contentStream = await response.Content.ReadAsStreamAsync(),
                              fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize, useAsync: true))
                {
                    long totalReadBytes = 0; // 记录已读取的字节数
                    int bytesRead; // 当前读取的字节数

                    // 循环读取数据直到内容流结束
                    while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                    {
                        // 将缓冲区中的数据写入文件流
                        await fileStream.WriteAsync(buffer, 0, bytesRead);
                        totalReadBytes += bytesRead; // 更新已读取的字节数

                        // 输出下载进度
                        if (totalBytes > 0)
                        {
                            Console.WriteLine($"下载{totalReadBytes} of {totalBytes} 字节.");
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // 捕获并输出异常信息,然后重新抛出异常
            Console.WriteLine($"错误: {ex.Message}");
            throw;
        }
    }
}

标签:文件,高效,读取,C#,new,using,bytesRead,下载
From: https://blog.csdn.net/qq_64948696/article/details/141335167

相关文章

  • C语言程序设计-[24] 程序结构与函数定义
    1、C程序基本结构。2、函数的分类。3、函数的定义。无参函数的代码示例如下:注:调用的函数都是无返回值的,所以使用了void。有参函数的代码示例如下:注1:调用的函数是有参数的,main()函数的a,b,c值分别传给了average()函数的x,y,z;注2:调用的函数是有返回值的,且返......
  • MVCC 详解
    MVCC简单理解MVCC,全称Multi-VersionConcurrencyControl,是多版本并发控制的意思。在高并发情况下操作数据库可能会出现脏写、脏读、不可重复度、幻读这四个问题。通过MVCC可以实现在不加锁的前提下避免一些问题。MVCC的实现原理多版本首先,我们引入一个概念,即行数......
  • C语言程序设计-[23] 数组应用(续)
    1、输入一行字符,统计其中有多少个单词。根据以上分析,代码与结果如下:#include"stdio.h"intmain(){charc,pre,str[81];inti,n=0;gets(str);pre='';for(i=0;c=str[i];i++){ if(c!=''&&pre=='') {......
  • Redis在Linux(Centos7)单机部署和集群部署
    目录一、单机部署1、软件准备 2、安装配置3、启动Redis二、Redis集群2.1、主从模式2.1.1、作用 2.1.2、规划图2.1.3、具体配置准备工作 主从配置启动测试 2.1.4、主从复制原理主从全量复制主从增量同步(slave重启或后期数据变化)2.1.5、缺点 2.2、哨兵......
  • 一文了解CISP,太全了
    一、什么是“CISP”?CISP是中国信息安全测评中心依据中编办赋予的职能,建立和发展的一整套完整的信息安全保障人才培训体系,从2002年开始启动。CISP(CertifiedInformationSecurityProfessional,CISP)中文名称为“注册信息安全专业人员”,是对信息安全专业人员所具备的专业素......
  • C# 异步方法
    概念:异步方法是使用async和await关键字创建的,其中async关键字用于声明异步方法,而await关键字用于等待异步操作完成。它们允许你编写非阻塞代码,即代码在等待异步操作完成时不会阻塞调用线程。这种编程模型(异步编程模型)通常用于提高应用程序的响应能力,异步编程是一种编程范式,C#......
  • 用UDP协议实现跨主机文件传输,实现下载与上传文件(FTFP)
    要求:实现下载服务器目录上任意文件与上传本地文件到服务器特定目录下tftp协议概述简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输特点:是应用层协议基于UDP协议实现数据传输模式:octet:二进制模式(常用)服务器端:tftp下载模型TFTP通信过程总结......
  • 小红书实战宝典:解锁爆款密码,从矩阵号到高效投放
    关键词:小红书营销,矩阵号策略,内容创造,数据分析目录:品牌矩阵号构建与管理视频教程:《商家矩阵号打法》产品形象塑造视频教程:《产品塑造》高质量内容生产视频教程:《内容制造》图文笔记发布技巧视频教程:《如何发图文笔记》短视频内容创作与优化视频教程:《短视频》......
  • 各行各业CAE/CFD/热/电磁仿真,一般用哪些软件?
    各行各业CAE/CFD/热/电磁仿真,一般用哪些软件?结构的仿真计算,用手算公式的时代早已经过去了,基本都基于CAE工业软件进行分析。我们说的是工业界的情况,不谈高校。学校里面只教原理,不告诉你这个原理有什么用,工业界只管你会用,不管原理是什么。学校和工业界都是瞎子,一个瞎的是左眼,一......
  • 配置 昇腾 Ascend C/C++ 开发环境
    配置昇腾AscendC/C++开发环境flyfish这里以OrangePiAiPro为例先说如何配置MindStudio,然后再说如何查看OrangePiAiPro的一些信息OrangePiAIPro开发板是香橙派联合华为精心打造的高性能AI开发板,其搭载了昇腾AI处理器。Linux桌面系统的默认登录用户为H......