using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Threading; public class AssetDeCompressTask { public static string assetDeCompressVersion { get { return LocalSave.GetString("AssetDeCompressVersion"); } set { LocalSave.SetString("AssetDeCompressVersion", value); } } public static bool assetDeCompressCompleted { get { if (string.IsNullOrEmpty(assetDeCompressVersion)) { return false; } else { return assetDeCompressVersion == VersionConfig.Get().version; } } } public static void Decompress(string path) { var files = new List(); FileExtersion.GetAllDirectoryFileInfos(path, files); foreach (var item in files) { var fullName = item.FullName; if (fullName.EndsWith(".7z")) { SevenZipUtility.DeCompress(fullName, Path.GetDirectoryName(fullName)); } } } public static DecompressProgress DecompressAync(string path) { var progress = new DecompressProgress(); var files = new List(); FileExtersion.GetAllDirectoryFileInfos(path, files); for (var i = files.Count - 1; i >= 0; i--) { var fullName = files[i].FullName; if (!fullName.EndsWith(".7z")) { files.RemoveAt(i); } } var total = files.Count; if (total == 0) { progress.progress = 1f; progress.done = true; return progress; } ThreadPool.QueueUserWorkItem((object a) => { var index = 0; foreach (var item in files) { var fullName = item.FullName; if (fullName.EndsWith(".7z")) { SevenZipUtility.DeCompress(fullName, Path.GetDirectoryName(fullName)); index++; progress.progress = index / (float)total; } } progress.done = true; }); return progress; } public static void Delete7zFiles(string path) { var files = new List(); FileExtersion.GetAllDirectoryFileInfos(path, files); for (var i = files.Count - 1; i >= 0; i--) { var fullName = files[i].FullName; if (fullName.EndsWith(".7z")) { files[i].Delete(); } } } public class DecompressProgress { object progressLock = new object(); float m_Progress = 0f; public float progress { get { return m_Progress; } set { lock (progressLock) { m_Progress = value; } } } object doneLock = new object(); bool m_Done = false; public bool done { get { return m_Done; } set { lock (doneLock) { m_Done = value; } } } } }