//IFS工具处理 处理 public void DoResIFSPackage(BuildTarget target, IFSCompressType ct = IFSCompressType.None, bool firstInclude = false, bool mergeLua = false, string luaZipName = "") { //SVN 版本号 string svnVersion = EditorSvnHelper.DoSvnInfoRivision(JW.Res.FileUtil.CombinePaths(Application.dataPath, "Resources")); //合并Lua脚本 if (mergeLua && (!string.IsNullOrEmpty(luaZipName))) { IFSArchiver.ArchiveDir(JW.Res.FileUtil.CombinePaths(_ifsBuildPath, GetPlatformStr(target), "LuaScripts"), JW.Res.FileUtil.CombinePaths(_ifsBuildPath, GetPlatformStr(target), luaZipName), IFSCompressType.None); //删除散lua 脚本 JW.Res.FileUtil.DeleteDirectory(JW.Res.FileUtil.CombinePaths(_ifsBuildPath, GetPlatformStr(target), "LuaScripts")); } //生成文件列表 IFSTool.GenerateFileList(JW.Res.FileUtil.CombinePath(_ifsBuildPath, GetPlatformStr(target)), _ifsFileListName, svnVersion); string dd = JW.Res.FileUtil.CombinePath(_ifsBuildPath, GetPlatformStr(target)); string zipPath = JW.Res.FileUtil.CombinePath(_ifsBuildPath, _ifsZipFileName); IFSTool.GenerateFirstIFSFile(zipPath, dd, ct); if (firstInclude) { //copy IFSTool.MoveFirstIFSFileToStreamingAssets(zipPath); } //移动Zip到原本目录 if (JW.Res.FileUtil.IsFileExist(zipPath)) { string fileName = JW.Res.FileUtil.GetFullName(zipPath); string dir = JW.Res.FileUtil.CombinePath(_ifsBuildPath, GetPlatformStr(target)); string dstPath = JW.Res.FileUtil.CombinePath(dir, _ifsZipFileName); JW.Res.FileUtil.MoveFile(zipPath, dstPath); } }
//条目名称长度 private bool DealEntryNameLength() { if (_waitToDealBytes.Count > 4) { byte[] dd = _waitToDealBytes.GetRange(0, 4).ToArray(); _dealOffset = 0; _entryNameLength = IFSArchiver.ConvertBytesToInt(dd, ref _dealOffset); _waitToDealBytes.RemoveRange(0, 4); JW.Common.Log.LogD("Get EntryName Length:{0}", _entryNameLength); dd = null; if (_entryNameLength <= 0) { JW.Common.Log.LogE("Get Error EntryName Length"); _isError = true; return(false); } else { //条目名称段 _ifsFile.Entrys = new IFSEntry[_ifsFile.EntryCount]; for (int i = 0; i < _ifsFile.EntryCount; i++) { _ifsFile.Entrys[i] = new IFSEntry(); } return(true); } } return(false); }
//处理签名获取数据 private bool DealSignatureData() { if (_waitToDealBytes.Count > 4) { byte[] dd = _waitToDealBytes.GetRange(0, 4).ToArray(); _dealOffset = 0; uint sig = (uint)IFSArchiver.ConvertBytesToInt(dd, ref _dealOffset); // _waitToDealBytes.RemoveRange(0, 4); // if (sig != IFSFile.IFSSignature) { JW.Common.Log.LogE("IFSDownloader DealSignatureData Error Signature "); // _isError = true; return(false); } else { JW.Common.Log.LogD("Get Signature:{0:X}", sig); return(true); } } return(false); }
/// <summary> /// 生成IFS 的首次Zip包 /// </summary> /// <param name="ifsBuildDir"></param> /// <param name="firstName"></param> public static void GenerateFirstIFSFile(string firstNamePath, string ifsBuildDir, IFSCompressType tt = IFSCompressType.None) { if (!JW.Res.FileUtil.IsDirectoryExist(ifsBuildDir)) { JW.Common.Log.LogE("Dir Not Exist:" + ifsBuildDir); } IFSArchiver.ArchiveDir(ifsBuildDir, firstNamePath, tt); }
//处理条目文件数据 private bool DealEntryDatas() { if (_waitToDealBytes.Count > 4 && (_dealEntryDataIndex < _ifsFile.EntryCount)) { //数据长度 _dealOffset = 0; IFSEntry entry = _ifsFile.Entrys[_dealEntryDataIndex]; byte[] ll = _waitToDealBytes.GetRange(0, 4).ToArray();; int vv = IFSArchiver.ConvertBytesToInt(ll, ref _dealOffset); entry.DataSize = vv; if (_waitToDealBytes.Count >= (4 + vv)) { string outPath = JW.Res.FileUtil.CombinePaths(_unarchiveDir, entry.Name); string directory = Path.GetDirectoryName(outPath); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } //数据 byte[] fileDd = _waitToDealBytes.GetRange(4, vv).ToArray(); if (_ifsFile.CompressType == IFSCompressType.None) { // JW.Res.FileUtil.DeleteFile(outPath); // FileStream output = new FileStream(outPath, FileMode.Create); try { output.Write(fileDd, 0, vv); output.Flush(); } finally { output.Close(); output.Dispose(); output = null; } } else if (_ifsFile.CompressType == IFSCompressType.LZMA) { //LZMA 数据 UnLzmaDataToFile(outPath, fileDd, vv); } // _dealEntryDataIndex++; //移除 _waitToDealBytes.RemoveRange(0, vv + 4); return(true); } else { return(false); } } return(false); }
//获取压缩方式 private bool DealCompressType( ) { if (_waitToDealBytes.Count > (4)) { byte[] dd = _waitToDealBytes.GetRange(0, 4).ToArray(); _dealOffset = 0; _ifsFile.CompressType = (IFSCompressType)IFSArchiver.ConvertBytesToInt(dd, ref _dealOffset); _waitToDealBytes.RemoveRange(0, 4); JW.Common.Log.LogD("Get CompressType:{0}", _ifsFile.CompressType.ToString()); return(true); } return(false); }
//条目数据位置信息 private bool DealEntryDataPos() { if (_waitToDealBytes.Count > (_ifsFile.EntryCount * 4)) { byte[] poss = _waitToDealBytes.GetRange(0, _ifsFile.EntryCount * 4).ToArray(); _dealOffset = 0; for (int i = 0; i < _ifsFile.EntryCount; i++) { IFSEntry entry = _ifsFile.Entrys[i]; int vv = IFSArchiver.ConvertBytesToInt(poss, ref _dealOffset); entry.DataPos = vv; } _waitToDealBytes.RemoveRange(0, _ifsFile.EntryCount * 4); poss = null; return(true); } return(false); }
//处理条目名称 private bool DealEntryNames() { if (_waitToDealBytes.Count > _entryNameLength) { byte[] names = _waitToDealBytes.GetRange(0, _entryNameLength).ToArray(); _dealOffset = 0; //读取条目名称 for (int i = 0; i < _ifsFile.EntryCount; i++) { IFSEntry entry = _ifsFile.Entrys[i]; entry.Name = IFSArchiver.ConvertBytesToString(names, ref _dealOffset); JW.Common.Log.LogD("Get Entry Name:" + entry.Name); } // _waitToDealBytes.RemoveRange(0, _entryNameLength); // names = null; return(true); } return(false); }
//条目个数 private bool DealEntryCnt() { if (_waitToDealBytes.Count > 4) { byte[] dd = _waitToDealBytes.GetRange(0, 4).ToArray(); _dealOffset = 0; _ifsFile.EntryCount = IFSArchiver.ConvertBytesToInt(dd, ref _dealOffset); _waitToDealBytes.RemoveRange(0, 4); JW.Common.Log.LogD("Get EntryCount:{0}", _ifsFile.EntryCount); if (_ifsFile.EntryCount <= 0) { JW.Common.Log.LogE("Get Error EntryCount"); _isError = true; return(false); } else { return(true); } } return(false); }
//首次移动或者下载 IEnumerator DoFirstMoveOrDownload() { bool isNeedMove = false; if (!JW.Res.FileUtil.IsExistInIFSExtraFolder(_curSession.FileListFileName)) { isNeedMove = true; } //--------------------移动或者下载-------- if (isNeedMove) { string filePath = ""; bool isDownload = false; //存在 if (JW.Res.FileUtil.IsFileExistInStreamingAssets(_curSession.FirstZipName)) { CallSessionHandler(IFSState.FirstMoveInit, 0); filePath = JW.Res.FileUtil.GetStreamingAssetsPathWithHeader(_curSession.FirstZipName); } else { isDownload = true; filePath = _curSession.FirstZipURL; CallSessionHandler(IFSState.FirstDownloadInit, 0); } JW.Common.Log.LogD("DoFirstMoveOrDownload:" + filePath); yield return(null); if (!string.IsNullOrEmpty(filePath)) { string ifsDirPath = JW.Res.FileUtil.GetIFSExtractPath(); if (!JW.Res.FileUtil.IsDirectoryExist(ifsDirPath)) { JW.Common.Log.LogD("Create IFS Dir " + ifsDirPath); JW.Res.FileUtil.CreateDirectory(ifsDirPath); } //非android 直接解压 if (false)//isDownload==false && (Application.platform== RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.WindowsPlayer|| Application.platform == RuntimePlatform.WindowsEditor)) { CallSessionHandler(IFSState.FirstUnZip, 0f); string pp = JW.Res.FileUtil.GetStreamingAssetsPath(_curSession.FirstZipName); IFSArchiver.SyncUnarchiveIFSFile(pp, ifsDirPath, false); CallSessionHandler(IFSState.FirstUnZip, 1f); } else { //边下载边解档 IFSFileDownloader www = new IFSFileDownloader(filePath, ifsDirPath); _cachedDownloader = www; // CallSessionHandler(isDownload ? IFSState.FirstDownloading : IFSState.FirstMoving, 0); // www.Begin(); while (www.IsDone == false) { www.Update(); CallSessionHandler(isDownload ? IFSState.FirstDownloading : IFSState.FirstMoving, www.Progress); yield return(null); } if (www.IsError == false) { CallSessionHandler(isDownload ? IFSState.FirstDownloading : IFSState.FirstMoving, 1.0f); yield return(null); CallSessionHandler(IFSState.FirstUnZip, 0f); yield return(null); CallSessionHandler(IFSState.FirstUnZip, 1.0f); } else { JW.Common.Log.LogE("IFSService DoFirstMoveOrDownload Error"); _errorCnt++; CallSessionHandler(isDownload ? IFSState.FirstDownloadFailed : IFSState.FirstMoveFailed, 1.0f); } www.Dispose(); www = null; _cachedDownloader = null; } } else { JW.Common.Log.LogE("IFSService DoFirstMoveOrDownload Error FilePATH"); CallSessionHandler(isDownload ? IFSState.FirstDownloadFailed : IFSState.FirstMoveFailed, 1.0f); } } else { JW.Common.Log.LogD("No Need Move!"); } yield return(null); }