using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading; using ICSharpCode.SharpZipLib.Zip; using UnityEngine; public class UnZipThread { public Thread thread; private UnZipThreadPool unZipThreadPool; private string unPath; private byte[] zipData = new byte[2048]; public bool isUnEnd; private bool isUpdateEnd; public void InitUnZip(UnZipThreadPool unZipThreadPool) { this.unZipThreadPool = unZipThreadPool; unPath = unZipThreadPool.unPath; isUpdateEnd = true; thread = new Thread(ThreadUpdate); thread.Start(); } private void ThreadUpdate() { while (isUpdateEnd) { try { ZipEntry ze = null; Stream stream = null; lock (unZipThreadPool.allZipFile) { if (unZipThreadPool.allZipFile.Count > 0) { ze = unZipThreadPool.allZipFile[0]; unZipThreadPool.allZipFile.Remove(ze); stream = unZipThreadPool.zipFile.GetInputStream(ze); } } if (ze == null) { Thread.Sleep(1000); return; } isUnEnd = false; UnzipFile(ze, stream, unPath); } catch (Exception e) { Debug.LogError("解压失败"); } isUnEnd = true; Thread.Sleep(10); } } public void Cloas() { isUpdateEnd = false; thread = null; } private void UnzipFile(ZipEntry zip, Stream stream, string dirPath) { FileStream fileStream = null; try { //文件名不为空 if (!string.IsNullOrEmpty(zip.Name)) { string filePath = dirPath; string[] files = zip.Name.Split('/'); // if (files.Length < 2) // { // return; // } filePath += "/" + files[files.Length - 1]; //如果是一个新的文件路径 这里需要创建这个文件路径 if (IsDirectory(filePath)) { Debug.Log("Create file paht " + filePath); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } } else { if (File.Exists(filePath)) { File.Delete(filePath); } fileStream = File.Create(filePath); // Debug.Log(filePath); // MemoryStream ms = new MemoryStream(); int size = 0; //每次读取2MB 直到把这个内容读完 while (true) { size = stream.Read(zipData, 0, zipData.Length); //小于0, 也就读完了当前的流 if (size > 0) { unZipThreadPool.currSize += size; fileStream.Write(zipData, 0, size); } else { break; } } fileStream.Flush(); fileStream.Close(); fileStream.Dispose(); fileStream = null; } } } catch (Exception e) { if (fileStream != null) { fileStream.Close(); fileStream.Dispose(); } fileStream = null; Debug.LogError("解压错误" + zip.Name); Debug.Log(e); } } /// /// 判断是否是目录文件 /// /// /// private bool IsDirectory(string path) { if (path[path.Length - 1] == '/') { return true; } return false; } } public class UnZipThreadPool { public string unPath; public float jd { get { return currSize / maxSize; } } public float currSize; public bool isEnd { get { bool isCount = false; lock (allZipFile) { if (allZipFile.Count <= 0) { isCount = true; } } if (isCount) { for (int i = 0; i < _zipThreads.Count; i++) { if (!_zipThreads[i].isUnEnd) { return false; } } return true; } return false; } } public float maxSize; public ZipFile zipFile; public List allZipFile = new List(); private List _zipThreads = new List(); public int CurrCount() { lock (allZipFile) { return allZipFile.Count; } } private FileStream fileStream; public void InitUnZip(byte[] zipData, string unPath) { this.unPath = unPath; maxSize = zipData.Length; MemoryStream ms = new MemoryStream(zipData); zipFile = new ZipFile(ms); IEnumerator ie = zipFile.GetEnumerator(); while (ie.MoveNext()) { allZipFile.Add((ZipEntry) ie.Current); } for (int i = 0; i < 8; i++) { UnZipThread u = new UnZipThread(); u.InitUnZip(this); _zipThreads.Add(u); } } public void InitUnZip(string filePath, string unPath) { if (!Directory.Exists(unPath)) { Directory.CreateDirectory(unPath); } this.unPath = unPath; fileStream = new FileStream(filePath, FileMode.Open); zipFile = new ZipFile(fileStream); IEnumerator ie = zipFile.GetEnumerator(); while (ie.MoveNext()) { allZipFile.Add((ZipEntry) ie.Current); } maxSize = allZipFile.Count; for (int i = 0; i < 4; i++) { UnZipThread u = new UnZipThread(); u.InitUnZip(this); _zipThreads.Add(u); } } public void Cloas() { for (int i = 0; i < _zipThreads.Count; i++) { _zipThreads[i].Cloas(); } if (fileStream != null) { fileStream.Close(); fileStream.Dispose(); } allZipFile.Clear(); fileStream = null; } // public void UnzipWithPath() // { // Debug.Log("dirpath is:" + unPath); // //ZipEntry:文件条目 就是该目录下所有的文件列表(也就是所有文件的路径) // ZipEntry zip = null; // //输入的所有的文件流都是存储在这里面的 // ZipInputStream zipInStream = null; // // MemoryStream ms = new MemoryStream(zipData); // // //读取文件流到zipInputStream // zipInStream = new ZipInputStream(ms); // // int topSize = zipData.Length; // // int countCount = 0; // // //循环读取Zip目录下的所有文件 // while ((zip = zipInStream.GetNextEntry()) != null) // { // // Debug.Log("name is:" zip.Name " zipStream " zipInStream); // UnzipFile(zip, zipInStream, unPath); // countCount++; // jd = currSize * 1.0f / topSize; // if (countCount > 20) // { // countCount = 0; // Thread.Sleep(10); // } // } // // zipInStream.Close(); // isEnd = true; // } // // private void UnzipFile(ZipEntry zip, ZipInputStream zipInStream, string dirPath) // { // try // { // //文件名不为空 // if (!string.IsNullOrEmpty(zip.Name)) // { // string filePath = dirPath; // string[] files = zip.Name.Split('/'); // if (files.Length < 2) // { // return; // } // // filePath += "/" + files[files.Length - 1]; // // // //如果是一个新的文件路径 这里需要创建这个文件路径 // if (IsDirectory(filePath)) // { // Debug.Log("Create file paht " + filePath); // if (!Directory.Exists(filePath)) // { // Directory.CreateDirectory(filePath); // } // } // else // { // MemoryStream ms = new MemoryStream(); // // int size = 0; // // //每次读取2MB 直到把这个内容读完 // while (true) // { // size = zipInStream.Read(zipData, 0, zipData.Length); // //小于0, 也就读完了当前的流 // if (size > 0) // { // currSize += size; // ms.Write(zipData, 0, size); // } // else // { // break; // } // } // // ms.Flush(); // byte[] fileData = ms.ToArray(); // File.WriteAllBytes(filePath, fileData); // if (zip.Name.Contains("md5File")) // { // File.WriteAllBytes(md5Path, fileData); // } // // ms.Close(); // ms.Dispose(); // } // } // } // catch (Exception e) // { // Debug.LogError("解压错误"+zip.Name); // Debug.Log(e); // } // } // // /// // /// 判断是否是目录文件 // /// // /// // /// // private bool IsDirectory(string path) // { // if (path[path.Length - 1] == '/') // { // return true; // } // // return false; // } }