当前位置: 首页 > article >正文

C#拼接小文件合成一个大文件

使用场景:

通过C#将一个超大文件或压缩包按照固定大小分割成多个小文件,将小文件上传到服务器在场景加载时再将小文件一个一个下载下来进行拼接合成一个大文件。
模仿Unity的打obb文件,项目的原因不能直接使用Unity的BuildAppBundle所以自己仿照机制做了一个简单流程。
大文件按照固定文件大小分割成小文件就不写了,往上有很多基本都能实现。


问题描述及解决方案

我是将一个5g大小的一个zip包按照一个文件1g大小进行分割,得到5个1g大小的切片文件。
在将5个切片文件进行合并一个文件时Unity报错超出缓存池大小或者时流太长之类报错。
报错1:IOException: Stream was too long.
报错2:OverflowException: Arithmetic operation resulted in an overflow
找到了很多写法都有问题,但是最后找到C#合并文件相关代码成功避开报错如下。

/// <summary>
    /// 拼接文件
    /// </summary>
    /// <param name="strFile">所有切片文件路径</param>
    /// <param name="strPath">合并文件的地址+后缀</param>
    public void CombinFile(string[] strFile, string strPath)
    {
        FileStream AddStream = null;
        //以合并后的文件名称和打开方式来创建、初始化FileStream文件流
        AddStream = new FileStream(strPath, FileMode.Append);
        //以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件
        BinaryWriter AddWriter = new BinaryWriter(AddStream);
        FileStream TempStream = null;
        BinaryReader TempReader = null;
        //循环合并小文件,并生成合并文件
        for (int i = 0; i < strFile.Length; i++)
        {
            //以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用
            TempStream = new FileStream(strFile[i].ToString(), FileMode.Open);
            TempReader = new BinaryReader(TempStream);
            //读取分割文件中的数据,并生成合并后文件
            AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
            //关闭BinaryReader文件阅读器
            TempReader.Close();
            //关闭FileStream文件流
            TempStream.Close();
        }
        //关闭BinaryWriter文件书写器
        AddWriter.Close();
        //关闭FileStream文件流
        AddStream.Close();
    }

http://www.kler.cn/a/403576.html

相关文章:

  • 问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
  • WebStorm 安装配置(详细教程)
  • MyBatis的resultType和resultMap区别
  • 动态规划子数组系列一>等差数列划分
  • 【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作
  • i春秋-登陆(sql盲注爆字段,.git缓存利用)
  • Go context.Context
  • Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)
  • 机器翻译基础与模型 之二: 基于CNN的模型
  • 蓝桥杯每日真题 - 第18天
  • git修改安装位置后处理
  • labview中的调用链
  • 【Redis】GEO数据结构
  • Python实战 | 使用 Python 的日志库(logging)和 pandas 库对日志数据进行分析
  • PlncRNA-HDeep:使用基于两种编码风格的混合深度学习进行植物长非编码 RNA 预测
  • 5、深入剖析PyTorch DataLoader源码
  • 8-表的定义
  • 如何在 Ubuntu 上设置 SSH X11 转发并访问远程图形界面
  • Quality minus junk论文阅读
  • PyTorch基础学习01_创建张量常见属性数据转换图像
  • vue+node+Express+xlsx+emements-plus实现导入excel,并且将数据保存到数据库
  • 002创建ASP.NET Core项目-数据库优先
  • C++算法练习-day41——700二叉搜索树中的搜索
  • RFdiffusion EuclideanDiffuser类解读
  • 缓存cache
  • Apache和HTTPS证书的生成与安装