public static IEnumerator MakeZipAsync(string zipFile, string srcDir, IList <string> entries, IEditorWorkProgressShower winprog) { var logger = new EditorWorkProgressLogger() { Shower = winprog }; logger.Log("Zipping: " + zipFile); if (string.IsNullOrEmpty(zipFile) || entries == null || entries.Count == 0 || !System.IO.Directory.Exists(srcDir)) { logger.Log("Nothing to zip"); yield break; } var stream = PlatDependant.OpenWrite(zipFile); if (stream == null) { logger.Log("Cannot create zip file."); yield break; } var zip = new ZipArchive(stream, ZipArchiveMode.Create); try { if (!srcDir.EndsWith("/") && !srcDir.EndsWith("\\")) { srcDir += "/"; } for (int i = 0; i < entries.Count; ++i) { var entry = entries[i]; if (winprog != null && AsyncWorkTimer.Check()) { yield return(null); } logger.Log(entry); if (string.IsNullOrEmpty(entry)) { continue; } var src = srcDir + entry; if (PlatDependant.IsFileExist(src)) { try { using (var srcstream = PlatDependant.OpenRead(src)) { var zentry = zip.CreateEntry(entry.Replace('\\', '/')); using (var dststream = zentry.Open()) { srcstream.CopyTo(dststream); } } } catch (Exception e) { logger.Log("(Error)(Not Critical)"); logger.Log(e.ToString()); } } } } finally { zip.Dispose(); stream.Dispose(); } }
public static TaskProgress MakeZipBackground(string zipFile, string srcDir, IList <string> entries, System.Threading.EventWaitHandle waithandle) { return(PlatDependant.RunBackground(progress => { try { if (string.IsNullOrEmpty(zipFile) || entries == null || entries.Count == 0 || !System.IO.Directory.Exists(srcDir)) { return; } progress.Total = entries.Count; using (var stream = PlatDependant.OpenWrite(zipFile)) { using (var zip = new ZipArchive(stream, ZipArchiveMode.Create)) { if (!srcDir.EndsWith("/") && !srcDir.EndsWith("\\")) { srcDir += "/"; } for (int i = 0; i < entries.Count; ++i) { progress.Length = i; var entry = entries[i]; if (string.IsNullOrEmpty(entry)) { continue; } var src = srcDir + entry; if (PlatDependant.IsFileExist(src)) { try { using (var srcstream = PlatDependant.OpenRead(src)) { var zentry = zip.CreateEntry(entry.Replace('\\', '/')); using (var dststream = zentry.Open()) { srcstream.CopyTo(dststream); } } } catch (Exception e) { PlatDependant.LogError("zip entry FAIL! " + entry); PlatDependant.LogError(e); } } } } } } catch (Exception e) { PlatDependant.LogError("Build zip FAIL! " + zipFile); PlatDependant.LogError(e); } finally { if (waithandle != null) { waithandle.Set(); } } })); }
public static System.IO.Stream GetLuaStream(string name, out string location) { #if UNITY_EDITOR try { if (!string.IsNullOrEmpty(name)) { if (name.Length > 0 && name[0] == '?') { var real = name.Substring("?raw.".Length); string mod = null; string norm = real; if (real.StartsWith("mod.")) { if (real.StartsWith("mod.\"")) { var mindex = real.IndexOf('\"', "mod.\"".Length); if (mindex > 0) { mod = real.Substring("mod.\"".Length, mindex - "mod.\"".Length); norm = real.Substring(mindex + 2); } } else { var mindex = real.IndexOf('.', "mod.".Length); if (mindex > 0) { mod = real.Substring("mod.".Length, mindex - "mod.".Length); norm = real.Substring(mindex + 1); } } } norm = norm.Replace('.', '/'); bool isFileExist = false; if (mod == null) { real = "Assets/CapsSpt/" + norm + ".lua"; } else { string package; ResManager.EditorResLoader.ResRuntimeCache.ModToPackage.TryGetValue(mod, out package); if (!string.IsNullOrEmpty(package)) { real = "Packages/" + package + "/CapsSpt/" + norm + ".lua"; //real = EditorToClientUtils.GetPathFromAssetName(real); isFileExist = !string.IsNullOrEmpty(real) && PlatDependant.IsFileExist(real); } if (!isFileExist) { real = "Assets/Mods/" + mod + "/CapsSpt/" + norm + ".lua"; } } if (isFileExist || PlatDependant.IsFileExist(real)) { location = real; return(PlatDependant.OpenRead(real)); } } else { var file = "CapsSpt/" + name.Replace('.', '/') + ".lua"; string found; if (ThreadLocalObj.GetThreadId() == ThreadSafeValues.UnityThreadID) { found = ResManager.EditorResLoader.CheckDistributePath(file, true); } else { found = ResManager.EditorResLoader.CheckDistributePathSafe(file); } //if (found != null) //{ // if (found.StartsWith("Packages/")) // { // found = EditorToClientUtils.GetPathFromAssetName(found); // } //} if (found != null) { location = found; return(PlatDependant.OpenRead(found)); } } } } catch (Exception e) { PlatDependant.LogError(e); } #elif UNITY_ENGINE || UNITY_5_3_OR_NEWER try { if (name.Length > 0 && name[0] == '?') { if (name.StartsWith("?raw.")) { if (_RuntimeRawManifest != null) { var real = name.Substring("?raw.".Length); real = real.Replace("\"", ""); string archreal = Environment.Is64BitProcess ? "@64." + real : "@32." + real; CapsResManifestNode node; if (_RuntimeRawManifest.TryGetItemIgnoreExt(archreal, out node, _LuaRequireSeperateChars) || _RuntimeRawManifest.TryGetItemIgnoreExt(real, out node, _LuaRequireSeperateChars)) { if (node != null && node.Item != null) { var item = node.Item; while (item.Ref != null) { item = item.Ref; } return(GetLuaStream(item, out location)); } } } } } else { if (_RuntimeManifest != null) { var node = _RuntimeManifest.GetItem(name, _LuaRequireSeperateChars); if (node != null && node.Item != null) { var item = node.Item; while (item.Ref != null) { item = item.Ref; } return(GetLuaStream(item, out location)); } } } } catch (Exception e) { PlatDependant.LogError(e); } #else try { if (!string.IsNullOrEmpty(name)) { if (name.Length > 0 && name[0] == '?') { var real = name.Substring("?raw.".Length); string mod = null; string norm = real; if (real.StartsWith("mod.")) { if (real.StartsWith("mod.\"")) { var mindex = real.IndexOf('\"', "mod.\"".Length); if (mindex > 0) { mod = real.Substring("mod.\"".Length, mindex - "mod.\"".Length); norm = real.Substring(mindex + 2); } } else { var mindex = real.IndexOf('.', "mod.".Length); if (mindex > 0) { mod = real.Substring("mod.".Length, mindex - "mod.".Length); norm = real.Substring(mindex + 1); } } } norm = norm.Replace('.', '/'); if (mod == null) { real = "/spt/" + norm + ".lua"; } else { real = "/mod/" + mod + "/spt/" + norm + ".lua"; } var stream = ResManager.LoadFileRelative(real); if (stream != null) { location = real; return(stream); } } else { var file = "/spt/" + name.Replace('.', '/') + ".lua"; string real, mod, dist; real = ResManager.FindFile(file, out mod, out dist); if (real != null) { try { var stream = PlatDependant.OpenRead(real); if (stream != null) { location = file; if (!string.IsNullOrEmpty(dist)) { location = "/dist/" + dist + location; } if (!string.IsNullOrEmpty(mod)) { location = "/mod/" + mod + location; } return(stream); } } catch (Exception e) { PlatDependant.LogError(e); } } } } } catch (Exception e) { PlatDependant.LogError(e); } #endif location = ""; return(null); }
public static void MakeObb(string dest, params string[] subzips) { if (!string.IsNullOrEmpty(dest) && subzips != null && subzips.Length > 0) { HashSet <string> reskeys = new HashSet <string>(); HashSet <string> sptkeys = new HashSet <string>(); using (var sdest = PlatDependant.OpenWrite(dest)) { using (var zdest = new ZipArchive(sdest, ZipArchiveMode.Create)) { for (int i = 0; i < subzips.Length; ++i) { try { var sfile = subzips[i]; if (PlatDependant.IsFileExist(sfile)) { var key = System.IO.Path.GetFileNameWithoutExtension(sfile).ToLower(); bool isres = false; bool isspt = false; HashSet <string> entrynames = new HashSet <string>(); using (var ssrc = PlatDependant.OpenRead(sfile)) { using (var zsrc = new ZipArchive(ssrc, ZipArchiveMode.Read)) { foreach (var sentry in zsrc.Entries) { var fullname = sentry.FullName; if (fullname.StartsWith("res/")) { isres = true; } else if (fullname.StartsWith("spt/")) { isspt = true; } if (entrynames.Add(fullname)) { var dentry = zdest.CreateEntry(fullname, isres ? CompressionLevel.NoCompression : CompressionLevel.Optimal); using (var ses = sentry.Open()) { using (var des = dentry.Open()) { ses.CopyTo(des); } } } } } } if (isres) { reskeys.Add(key); } if (isspt) { sptkeys.Add(key); } } } catch (Exception e) { PlatDependant.LogError(e); } } if (reskeys.Count > 0) { var resindex = zdest.CreateEntry("res/index.txt", CompressionLevel.Optimal); using (var sindex = resindex.Open()) { using (var swindex = new System.IO.StreamWriter(sindex, System.Text.Encoding.UTF8)) { foreach (var key in reskeys) { swindex.WriteLine(key); } } } } if (sptkeys.Count > 0) { var sptindex = zdest.CreateEntry("spt/index.txt", CompressionLevel.Optimal); using (var sindex = sptindex.Open()) { using (var swindex = new System.IO.StreamWriter(sindex, System.Text.Encoding.UTF8)) { foreach (var key in sptkeys) { swindex.WriteLine(key); } } } } } } } }
private static System.IO.Stream GetLuaStream(CapsResManifestItem item, out string location) { try { var rnode = item.Node; System.Text.StringBuilder sbpath = new System.Text.StringBuilder(); while (rnode.Parent != null) { if (sbpath.Length > 0) { sbpath.Insert(0, '/'); } sbpath.Insert(0, rnode.PPath); rnode = rnode.Parent; } var path = sbpath.ToString(); // load from update path var sptpath = ThreadSafeValues.UpdatePath + "/spt/" + path; if (PlatDependant.IsFileExist(sptpath)) { location = sptpath; return(PlatDependant.OpenRead(sptpath)); } // load from package if (ThreadSafeValues.AppStreamingAssetsPath.Contains("://")) { if (ThreadSafeValues.AppPlatform == RuntimePlatform.Android.ToString() && ResManager.LoadAssetsFromApk) { // Obb if (ResManager.LoadAssetsFromObb && ResManager.ObbZipArchive != null) { sptpath = "spt/" + path; int retryTimes = 10; for (int i = 0; i < retryTimes; ++i) { Exception error = null; do { ZipArchive za = ResManager.ObbZipArchive; if (za == null) { PlatDependant.LogError("Obb Archive Cannot be read."); break; } try { var entry = za.GetEntry(sptpath); if (entry != null) { location = sptpath; return(entry.Open()); } } catch (Exception e) { error = e; break; } } while (false); if (error != null) { if (i == retryTimes - 1) { PlatDependant.LogError(error); } else { PlatDependant.LogError(error); PlatDependant.LogInfo("Need Retry " + i); } } else { break; } } } // Apk //if (true) { sptpath = "assets/spt/" + path; int retryTimes = 10; for (int i = 0; i < retryTimes; ++i) { Exception error = null; do { ZipArchive za = ResManager.AndroidApkZipArchive; if (za == null) { PlatDependant.LogError("Apk Archive Cannot be read."); break; } try { var entry = za.GetEntry(sptpath); if (entry != null) { location = sptpath; return(entry.Open()); } } catch (Exception e) { error = e; break; } } while (false); if (error != null) { if (i == retryTimes - 1) { PlatDependant.LogError(error); } else { PlatDependant.LogError(error); PlatDependant.LogInfo("Need Retry " + i); } } else { break; } } } } } else { sptpath = ThreadSafeValues.AppStreamingAssetsPath + "/spt/" + path; if (PlatDependant.IsFileExist(sptpath)) { location = sptpath; return(PlatDependant.OpenRead(sptpath)); } } } catch (Exception e) { PlatDependant.LogError(e); } location = ""; return(null); }