Unity之Zip解压
发表于2017-09-03
using UnityEngine; using System.Collections; using System; using System.IO; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; public class MangeZip : MonoBehaviour { string sourcesPath = ""; string targetPath = ""; string filename = "test.zip"; ZipUtils zu; // Use this for initialization void Start() { sourcesPath = Application.dataPath "/Zip"; targetPath = Application.dataPath "/CompressZip"; Debug.Log("sourcesPaht is:" sourcesPath " " targetPath); StartCoroutine(StartUnZip()); } IEnumerator StartUnZip() { string uri = "file:///" sourcesPath "/" filename; WWW www = new WWW(uri); Debug.Log("uri is:" uri); yield return www; if (www.error != null) { Debug.Log("loading is faile"); } if (www.isDone) { Debug.Log("www is success"); } //如果路径不存在 则创建 if (!Directory.Exists(targetPath)) { Directory.CreateDirectory(targetPath); } //把当前的压缩包写入到指定的路径下 File.WriteAllBytes(targetPath "/" filename, www.bytes); //ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = System.Text.Encoding.UTF8.CodePage; StartCoroutine(UnzipWithPath(targetPath "/" filename)); } private int totalCount; private int doneCount; private int indicatorStep = 1; public IEnumerator UnzipWithPath(string path) { Debug.Log("paht is:" path); //这是根目录的路径 string dirPath = path.Substring(0, path.LastIndexOf('/')); Debug.Log("dirpath is:" dirPath); //ZipEntry:文件条目 就是该目录下所有的文件列表(也就是所有文件的路径) ZipEntry zip = null; //输入的所有的文件流都是存储在这里面的 ZipInputStream zipInStream = null; //读取文件流到zipInputStream zipInStream = new ZipInputStream(File.OpenRead(path)); //循环读取Zip目录下的所有文件 while ((zip = zipInStream.GetNextEntry()) != null) { Debug.Log("name is:" zip.Name " zipStream " zipInStream); UnzipFile(zip, zipInStream, dirPath); doneCount ; if (doneCount % indicatorStep == 0) { yield return new WaitForEndOfFrame(); } } try { zipInStream.Close(); } catch (Exception ex) { Debug.Log("UnZip Error"); throw ex; } Debug.Log("解压完成:" path); } static void UnzipFile(ZipEntry zip, ZipInputStream zipInStream, string dirPath) { try { //文件名不为空 if (!string.IsNullOrEmpty(zip.Name)) { string filePath = dirPath; filePath = ("/" zip.Name); //如果是一个新的文件路径 这里需要创建这个文件路径 if (IsDirectory(filePath)) { Debug.Log("Create file paht " filePath); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } } else { FileStream fs = null; //当前文件夹下有该文件 删掉 重新创建 if (File.Exists(filePath)) { File.Delete(filePath); } fs = File.Create(filePath); int size = 2048; byte[] data = new byte[2048]; //每次读取2MB 直到把这个内容读完 while (true) { size = zipInStream.Read(data, 0, data.Length); //小于0, 也就读完了当前的流 if (size > 0) { fs.Write(data, 0, size); } else { break; } } fs.Close(); } } } catch (Exception e) { throw new Exception(); } } /// <summary> /// 判断是否是目录文件 /// </summary> /// <param name="path"></param> /// <returns></returns> static bool IsDirectory(string path) { if (path[path.Length - 1] == '/') { return true; } return false; } }
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引