使用场景:
通过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();
}