private void UnzipFileThread(object obj) { int delatime = (int)obj; DebugUtils.Log(DebugUtils.Type.AssetBundle, "Unzip file thread run! time:" + delatime); // read 2048 int size = 2048; byte[] readData = new byte[size]; while (true) { if (unzipComplete && curUnZipData != null) { try { FileStream fs = null; // del old file and create a new file if (File.Exists(curUnZipData.targetPath)) { File.Delete(curUnZipData.targetPath); } fs = File.Create(curUnZipData.targetPath); while (true) { size = curUnZipData.stream.Read(readData, 0, readData.Length); if (size > 0) { fs.Write(readData, 0, size); } else { break; } } fs.Close(); fs.Dispose(); DebugUtils.Log(DebugUtils.Type.AssetBundle, "unzip complete! path:" + curUnZipData.sourcePath); } catch (System.Exception e) { DebugUtils.LogError(DebugUtils.Type.AssetBundle, string.Format("unzip err! path:{0} msg:{1}", curUnZipData.targetPath, e.Message)); } curUnZipData.sourcePath = curUnZipData.sourcePath.Replace("file:///", ""); //Delete local zip file #if UNITY_EDITOR File.Delete(curUnZipData.sourcePath); #else if (curUnZipData.sourcePath.StartsWith(zipAssetPath)) { File.Delete(curUnZipData.sourcePath); } #endif unzipComplete = false; curUnZipData = null; upZipProgressData.curIndex++; } else { Thread.Sleep(delatime); } } }
private IEnumerator UnzipFileHandler(Queue <string> queue, string bundDataTime, Callback callback) { ZipInputStream zipInputStream = null; ZipEntry zipEntry = null; WaitForEndOfFrame waitFrame = new WaitForEndOfFrame(); Thread unzipThread = new Thread(new ParameterizedThreadStart(UnzipFileThread)); int delatime = (int)(Time.deltaTime * 1000); unzipThread.Start(delatime); while (queue.Count != 0) { string localUrl = queue.Dequeue(); WWW www = new WWW(localUrl); yield return(www); if (!string.IsNullOrEmpty(www.error)) { //DebugUtils.LogError( DebugUtils.Type.AssetBundle, string.Format( "Loading zip file failed! when decompress zip! err: {0} url = {1}", www.error, localUrl ) ); www.Dispose(); www = null; continue; } zipInputStream = new ZipInputStream(new MemoryStream(www.bytes, 0, www.bytes.Length), true); zipInputStream.Password = "******"; while ((zipEntry = zipInputStream.GetNextEntry()) != null) { curUnZipData = new UnZipData(); curUnZipData.sourcePath = localUrl; curUnZipData.targetPath = assetPath + zipEntry.FileName; curUnZipData.stream = zipInputStream; unzipComplete = true; while (unzipComplete) { yield return(waitFrame); } } www.Dispose(); www = null; } DebugUtils.Log(DebugUtils.Type.AssetBundle, "unzip all files complete!"); RemoveLocalZipListFile(); unzipThread.Abort(); unzipThread = null; using (FileStream fs = new FileStream(zipAssetPath + cacheDataTimeTxt, FileMode.OpenOrCreate)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(bundDataTime); sw.Close(); sw.Dispose(); } fs.Close(); fs.Dispose(); } System.GC.Collect(); if (callback != null) { callback(); } }