.NET 关于文件分割与合并

.net core WebAPI --文件分片上传 因工作要求需要提供文件分片上传的功能,在这里记录一下。 阅读详情
										## 关于文件分割与合并

概要说明
关于文件分割和合并的方法网上有很多 ,但是我写的时候 这个方法的时候,网上的方法可能不太适用或者没有把文件分割和合并的要注意的点没有说出来
注意事项:如果一个文件,已每片1kb分的话读取的时候一定要注意流的位置否则合并之后会导致文件损坏,导致图片打不开或显示不全,视频播放不了等问题

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace 测试文件分割合并
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = @"E:\Utilts\TestFileSplit\1.pdf";
            var str1 = @"E:\Utilts\TestFileSplit\Test2\";
            var str2 = @"E:\Utilts\TestFileSplit\Test2\";
            var str3 = @"E:\Utilts\TestFileSplit\target\";
            //分割文件
            var msg = FileSplit(str, str1,1024);
            //合并文件
             MergeFileAttr(str2, str3, 1024);
            //计算文件大小
            var len = MergeFileSize(str1, 1024);
            Console.WriteLine(len);
        }
        #region 文件分割
        public static string FileSplit(string filePath, string path, long SplitFileSize)
        {
            Console.WriteLine("正在分解文件:" + System.IO.Path.GetFileName(filePath) + "请稍候......");
            var flag = string.Empty;
            if (string.IsNullOrEmpty(filePath))
            {
                flag = "文件路径不能为空";
            }
            if (string.IsNullOrEmpty(path))
            {
                flag = "目标路径不能为空";
            }
            long readLocation = 0;
            Stream stream = File.OpenRead(filePath);
            byte[] by = new byte[SplitFileSize];
            string item = "0";
            try
            {
                BufferedStream buffered = new BufferedStream(stream, 1024);
                BinaryReader reader = new BinaryReader(buffered);
                long len = reader.BaseStream.Length;
                var loopSize = (Convert.ToInt32(Math.Ceiling((double)stream.Length / by.Length)));
                for (int i = 0; i < loopSize; i++)
                {
                    if ((i + 1).ToString().Length == 1)
                    {
                        item = "00";
                    }
                    else if ((i + 1).ToString().Length == 2)
                    {
                        item = "0";
                    }
                    else
                    {
                        item = string.Empty;
                    }

                    reader.BaseStream.Seek(readLocation, SeekOrigin.Begin);
                    by = reader.ReadBytes(by.Length);
                    using (BinaryWriter writer = new BinaryWriter(File.Open(path + @"\" + System.IO.Path.GetFileName(filePath) + "." + ((i + 1).ToString()), FileMode.Create)))
                    {
                        writer.Write(by);
                        writer.Flush();
                    }
                    readLocation = (by.Length) * (i + 1);
                }
                flag = "文件分割成功";
            }
            catch (Exception ex)
            {
                flag = "文件分割失败";
            }
            Console.WriteLine("文件分解完成");
            return flag;
        }
        #endregion
        #region 文件合并
        /// <summary>
        /// 文件合并
        /// </summary>
        /// <param name="path">文件组集合路径</param>
        /// <param name="targetPath">合并之后的保存路径</param>
        /// <param name="SplitFileSize">已多大字节去合并</param>
        public static void MergeFileAttr(string path, string targetPath, long SplitFileSize)
        {
            int z = 0;
            Console.WriteLine("正在合并文件:请稍候......");
            byte[] by = new byte[SplitFileSize];
            DirectoryInfo directory = new DirectoryInfo(path);
            //获取路径下的分割文件集合
            FileInfo[] fileInfos = directory.GetFiles();
            //文件进行排序的集合
            ArrayList  array=SortAsFileName(path);
            foreach (FileInfo item in fileInfos)
            {
              var lastLen = item.FullName.LastIndexOf(".");
              var fileFullName=item.FullName.Substring(0, item.FullName.Length-(item.FullName.Length - lastLen)) + "." + array[z];
               z += 1;
                using (BufferedStream buffered = new BufferedStream(File.OpenRead(fileFullName)))
                {
                    using (BinaryReader stream = new BinaryReader(buffered))
                    {
                        using (BinaryWriter writer = new BinaryWriter(File.Open(targetPath + @"\" + "merge.pdf", FileMode.Append)))
                        {
                            if (stream.BaseStream.Length != SplitFileSize)
                            {
                                byte[] temp = new byte[stream.BaseStream.Length];
                                stream.BaseStream.Read(temp, 0, temp.Length);
                                writer.Write(temp);
                            }
                            else
                            {
                                stream.BaseStream.Read(by, 0, by.Length);
                                writer.Write(by);
                            }
                        }
                    }
                }
            }
            Console.WriteLine("文件合并完成");
        }
        #endregion
        #region 计算分割文件大小
        public static long MergeFileSize(string path, int size)
        {
            long len = 0;
            DirectoryInfo directory = new DirectoryInfo(path);
            //获取路径下的分割文件集合
            FileInfo[] fileInfos = directory.GetFiles();
            foreach (FileInfo item in fileInfos)
            {
                len += item.Length;
            }
            return len;
        }
        #endregion
        #region 对文件列表进行排序
        /// <summary>
        /// 对文件列表进行排序
        /// </summary>
        /// <param name="arrFi"></param>
        private static ArrayList SortAsFileName(string  path)
        {
            ArrayList list = new ArrayList();
            DirectoryInfo directory = new DirectoryInfo(path);
            //获取路径下的分割文件集合
            FileInfo[] fileInfos = directory.GetFiles();
            foreach (var item in fileInfos)
            {
                var len = System.IO.Path.GetFileName(item.FullName).LastIndexOf(".");
                var totalSize = System.IO.Path.GetFileName(item.FullName);
                var res = int.Parse(totalSize.Substring(len + 1, totalSize.Length - len - 1));
                list.Add(res);
            }
            list.Sort();
            return list;
        }
        #endregion
    }
}

.net core 批量上传大文件 阅读详情

相关推荐

使用iTextSharp.dll(v5.5.13.3)库在.NET 3.5中处理PDF文件

iTextSharp是一个开源的库,用于创建和操作PDF文档。这个强大的工具可以被.NET开发者用于生成复杂的报表、发票、合同等需要长期保留和分享的文档。它提供了丰富的API,可以用来编辑PDF的文本、图片、表格和其他元素。iTextSharp提供了一系列的命名空间,其中最核心的包括::这个命名空间包含了许多操作PDF文档内容的基本元素,比如文档、段落、图像、表格以及各种布局元素。:专为PDF格式设计的高级功能,它包含用于创建和操作PDF文档的具体类,如PdfWriter。

weixin_36073714的博客 1223

.net中如何把多个文件合并成一个文件

懒得再单独写一个,所以就加了超级详细的注释 前几个判断主要是合并sql文件,什么样的sql对应的什么样的处理, 最后一个判断是合并任何文件 方法的两个参数:第一个是打开文件路径的集合,第二个参数文件保存路径 private void FileMerge(string[] filePath,string outFilePath) { try ...

許先生的博客 3424

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4896

.NET如何切片处理视频大文件

NET如何切片处理视频大文件,.NET如何分片处理视频大文件,.NET如何分段处理视频大文件,.NET如何分块处理视频大文件,.NET如何切割处理视频大文件,.NET如何分割处理视频大文件,.NET如何加密处理视频大文件,.NET如何切片断点续传视频大文件,.NET如何获取视频播放时长,要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,k=ACoAYgezAAw1dWofra。

weixin_52041354的博客 467

Python实战:3分钟搞定A股K线数据抓取(附东方财富/腾讯API完整代码)

本文为量化交易初学者提供了一份快速获取A股K线数据的实战指南。通过对比东方财富与腾讯财经两大免费API的优劣,并附上可直接运行的完整Python代码,帮助读者在3分钟内搭建起自己的数据抓取管道,为构建量化交易系统奠定坚实的数据基础。

weixin_29062255的博客 2920

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 705

.NET配置文件在写入时损坏

.NET配置文件旨在使用自定义部分(System.Configuration.ConfigurationSection)和部分组(System.Configuration.ConfigurationSectionGroup)进行自定义。为此,开发人员将这些基类子类化以实现其自定义功能并将它们合并到配置文件中。.NET配置文件是XML文件并遵循定义的架构。它有点复杂,但本文中相关的架构元素是beginning ()的声明部分,它声明了配置文件中使用的部分和部分组的布局和类型。这允许.NET配置机制使用配置信息

寒冰屋的专栏 478

银河麒麟(ky10)x86与arm双架构下编译zlmediakit的实战指南

本文提供了在银河麒麟(ky10)操作系统上,针对x86与arm双架构编译部署流媒体服务器zlmediakit的完整实战指南。文章详细阐述了从环境准备、依赖安装、代码获取到编译构建与测试的全过程,重点解析了两种CPU架构下的关键差异与注意事项,帮助开发者高效完成国产化平台上的流媒体服务搭建。

weixin_29306875的博客 101

.NET大文件分片上传

核心原理:该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。* 如何分片;* 如何合成一个文件;* 中断了从哪个分片开始。如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块的轮子,虽然程序员的天性曾迫使我重新造轮子。但是因为时间的关系还有工作的关系,我只能罢休了。最后我选择了百度的WebUploader来实现前端所需。如何合,在合之前,我们还得先解决一个问题,我们如何区分分块所属那个文件的。刚开始的时候,我是采用

weixin_52041354的博客 460

搭建适用于lammps中opls-aa力场的文件流程

现在我已经解决了以上问题,并且通过我的方法可以实现从空白文档到搭建完成以上全部内容,后期只要细心检查即可。需要的data文件最关键是获得相应阴阳离子的mmol文件,因此问题转化为构建一份mmol文件。主要用到的软件及程序:gaussian09,makemol程序(tranal),opls-aa的参数文件。二面角个数:成角原子序号及对应的参数(这里PF6的结构没有二面角,所以为0)参考文献个数:文献名(空够行数即可,这些是给自己的备忘))和自身体系对应的参考文献,修改或填入对应的参数即可。

baguette的博客 2888

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4515

.Net5 WebApi中操作PDF(分割复制PDF指定页 and 合并多个PDF文件)

.Net5 WebApi中操作PDF(分割复制PDF指定页 and 合并多个PDF文件)安装Nuget包PDF工具类 and 合并多个PDF为一个PDF 安装Nuget包 .Net Framework:install-package iTextSharp .Net Core/.Net5:install-package iTextSharp.LGPLv2.Core(我安装的1.7.1) PDF工具类 and 合并多个PDF为一个PDF using iTextSharp.text; using iTextSh

Ling、bug 855

第三天:Python基础语法详解

Python代码规范与注释最佳实践 摘要: 本文深度解析Python缩进规则与代码结构的技术规范,包括缩进的底层原理、语法规则和错误处理。详细阐述Python注释系统,涵盖行内注释、文档字符串和类型注释等多种形式,并提供工业级代码组织方案。研究显示,良好的缩进可提升40%的代码识别速度,降低50%的认知负荷。文章还对比了Sphinx、pdoc等主流文档生成工具,给出企业级项目中的注释编写原则和模板建议,帮助开发者构建更可维护的Python代码。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1013

VB.net 文件切片和合并算法

Imports System.IO Module Module1 Sub Main() Dim ZHUOMIAN = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) For I = 0 To 10 Dim RET = CutFile($"{ZHUOMIA...

aa326358942的博客 703

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 567

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Visual C#实现文件分割合并器

文 件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分 割多个可携带小文件,分步拷贝这些小文件,从而实现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。

enginetanmary的专栏 1286

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C#实现文件分割合并器

   文件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分割多个可携带小文件,分步拷贝这些小文件,从而实现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。.Net FrameWork SDK中提供的许多处理文件的类库,通过这些类能够简捷、灵活的实...

weixin_30685029的博客 76

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# 文件分割与合并工具设计与实现

文件分割与合并是数据管理中的基础操作,常用于大文件传输(如邮件附件限制)、分布式存储(拆分后存储至多个介质)、数据备份(分卷压缩)等场景。本工具基于 C# 语言开发,利用 .NET Framework的 System.IO命名空间实现二进制文件流操作,支持按大小分割(如每 1MB/10MB 一个文件)和按序号合并,具备跨平台(Windows/Linux/macOS via .NET Core)、高可靠性(异常捕获、校验机制)和易用性(命令行/GUI 双模式)特点

fie8889的博客 378

C#在实现分割、合并器

 【摘 要】本文的主要内容就是探讨一下Visual C#在对文件编程中的一个比较流行的应用--文件分割器和合并器。下面就首先了解一下Visual C#在实现分割、合并器时所使用的.Net FrameWork SDK提供的类库及其在本文中的使用方法。 文件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文

geruger的专栏 1512

用C#设计一个命令行方式的文件分割器

用C#设计一个命令行方式的文件分割器     共享软件中有很多界面美观的文件分割程序,将一个大文件分割成几个较小的文件,分别保存,需要的时候再合并成原来的文件,常常是必备的工具。     本文用微软的visual studio .net开发环境的C#语言也来设计一个文件分割器,并且以DOS命令行方式运行,就象使用copy命令一样简单。从中也可以了解文件分割的原理以及.net框架对文件的读写

zhoujunzs的专栏 891

PowerShell 分割和合并大文件

PowerShell 分割和合并大文件 技术要点 处理的一般都是大文件,所以使用.NET 中 FileStream 对象,因为流处理可以提高性能。 将缓冲区设置为1M-50M,当分割的单个文件大小超过1G时,使用50M内存,小于等于1M时,使用1M,其余按比例增加力求节省内存。 暂时不考虑使用并行处理,因为在此场景中性能更多由硬盘的读取速度决定。 分割出的文件在源文件名称后追加_part_001 这样的格式,方便在合并前按照升序排序。 # 先导入 函数 Split-Merge-File . 'E\Spl

Nann的博客 1480

使用.NET框架、Web service实现Android的文件上传(二)

本文是在《使用.NET框架、Web service实现Android的文件上传(一)》的基础上继续编写的,如有疑问请先查看第一篇。本文的代码(包括客户端与服务端)已经上传至GitHub,地址:https://github.com/weifengzz/UploadFile_1   要想实现大文件上传,如果使用第一篇讲到的方法是很不合适的,因为手机内存是有限的,而我们上传的文件的大小是不确定...

weixin_34321753的博客 195

【免费下载】 PDFSHARP-操作PDF:轻松管理和优化PDF文件

在数字化时代,PDF格式因其跨平台兼容性强、格式稳定而广受欢迎。然而,对PDF文件进行高效管理并非易事。本文将向您推荐一款开源项目——PDFSHARP-操作PDF,它为您提供了一套全面的PDF文件操作解决方案。 ## 项目介绍 PDFSHARP-操作PDF是一款专注于利用PDFSHARP工具进行PDF文件操作的教程资料。该项目涵盖了分割、合并PDF文件以及提取图片等核心功能,旨在帮助用户轻松管...

gitblog_06723的博客 1078
上一篇: .NET WebApi之基本过滤器
下一篇: SQL知识点总结
_徐林
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值