From ee96f089856e01bdfefd3aa185660650bf3a533e Mon Sep 17 00:00:00 2001 From: zhengxiaofeng <1641519158@qq.com> Date: Wed, 18 Aug 2021 22:37:24 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90lua=E6=A1=86=E6=9E=B6=E3=80=91?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=B0=86=E5=A4=9A=E4=B8=AAlua=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=89=93=E5=8C=85=E6=88=90=E4=B8=80=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Xlua/PakFile.cs | 111 +++++++++++++++++++++++++++++ Assets/Script/Xlua/PakFile.cs.meta | 11 +++ 2 files changed, 122 insertions(+) create mode 100644 Assets/Script/Xlua/PakFile.cs create mode 100644 Assets/Script/Xlua/PakFile.cs.meta diff --git a/Assets/Script/Xlua/PakFile.cs b/Assets/Script/Xlua/PakFile.cs new file mode 100644 index 0000000..b4e1e88 --- /dev/null +++ b/Assets/Script/Xlua/PakFile.cs @@ -0,0 +1,111 @@ +using System.Collections.Generic; +using System.Security.Cryptography; +using System.IO; +using ZFramework.Core; + + +namespace ZFramework.XLua +{ + /// + /// 用于将多个文件合并成一个大文件,在本框架内主要的作用是见将多个lua文件合并成一个大的文件 + /// + public class PakFile:System.IDisposable + { + public enum Mode + { + Read, + Write + } + + private struct PakEntry + { + public string name; + public uint offset; + public uint size; + } + + private string _pakFilePath; + private Mode _mode; + private uint _version; + private byte[] _md5; + private Dictionary _entriesMap; + private List _entriesList; + private uint _dataOffset; + private byte[] _data; + + public uint Version + { + get + { + return _version; + } + } + + private PakFile(string path, Mode mode) + { + _pakFilePath = path; + _mode = mode; + } + + /// + /// 向大文件内增加小文件 + /// + /// + /// + /// + public void AppendFile(string path,string relativeRootPath = null, char pathSepInName ='.') + { + if (!string.IsNullOrEmpty(path)) + { + path = path.Replace('\\', '/'); + using (FileStream fileStream = new FileStream(path, FileMode.Open)) + { + PakEntry info; + if (string.IsNullOrEmpty(relativeRootPath)) + { + int si = path.LastIndexOf('/'); + int ei = path.LastIndexOf('.'); + info.name = path.Substring(si + 1, ei - si - 1); + } + else + { + int si = path.LastIndexOf(relativeRootPath) + relativeRootPath.Length; + int ei = path.LastIndexOf('.'); + info.name = path.Substring(si + 1, ei - si - 1); + info.name = info.name.Replace('/', pathSepInName); + } + + info.offset = 0; + info.size = (uint) fileStream.Length; + byte[] data = new byte[info.size]; + fileStream.Read(data, 0, (int) info.size); + if (_data == null) + { + _data = data; + } + else + { + int srcOffset = _data.Length; + System.Array.Resize(ref _data, _data.Length + data.Length); + System.Buffer.BlockCopy(data, 0, _data, srcOffset, data.Length); + } + + if (_entriesList == null) + _entriesList = new List(); + _entriesList.Add(info); + } + } + } + + + ~PakFile() + { + Dispose(); + } + + public void Dispose() + { + + } + } +} \ No newline at end of file diff --git a/Assets/Script/Xlua/PakFile.cs.meta b/Assets/Script/Xlua/PakFile.cs.meta new file mode 100644 index 0000000..0e595fe --- /dev/null +++ b/Assets/Script/Xlua/PakFile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b196c97fe7ca7247bf4a136cf59e76b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- GitLab