unity解压缩zip发布后的一些问题
前段时间项目需要,搞了下zip的解压缩问题,也是利用ICSharpCode.SharpZipLib.dll来处理的zip,这里说下之前遇到的坑(这里提供我用的这个库ICSharpCode.SharpZipLib.dll ;http://note.youdao.com/noteshare?id=ce22c848c004c3be99c67ecb24f991fd&sub=E60263C2B3B54CEEBA584A23AACC8069)
一个简单调用:
/// <summary> /// 压缩Zip /// </summary> /// <param name="fileNames"></param> /// <param name="outputFilePath"></param> /// <param name="compressLevel">压缩等级</param> public static void ZipFile(string[] fileNames, string outPath, int compressLevel) { try { using (ZipOutputStream stream = new ZipOutputStream(File.Create(outPath))) { stream.SetLevel(compressLevel); byte[] buffer = new byte[4096]; foreach (string file in fileNames) { var entry = new ZipEntry(Path.GetFileName(file)) { DateTime = DateTime.Now }; stream.PutNextEntry(entry); using (FileStream fs = File.OpenRead(file)) { int sourceBytes; do { sourceBytes = fs.Read(buffer, 0, buffer.Length); stream.Write(buffer, 0, sourceBytes); } while (sourceBytes > 0); } } stream.Finish(); stream.Close(); Debug.Log("完成压缩"); } } catch (Exception e) { Debug.Log ("压缩出错:" + e); } } /// <summary> /// 解压 /// </summary> /// <param name="zipPath">压缩文件路径</param> /// <param name="outPath">解压出去路径</param> public static void UnZipFile(string zipPath, string outPath) { if (File.Exists(zipPath)) { using (ZipInputStream stream = new ZipInputStream(File.OpenRead(zipPath))) { ZipEntry theEntry; while ((theEntry = stream.GetNextEntry()) != null) { string fileName = Path.GetFileName(theEntry.Name); string filePath = Path.Combine(outPath, theEntry.Name); string directoryName = Path.GetDirectoryName(filePath); if (directoryName.Length > 0) Directory.CreateDirectory(directoryName); if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(filePath)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = stream.Read(data, 0, data.Length); if (size > 0) streamWriter.Write(data, 0, size); else break; } } } } Debug.Log("解压完成"); } } else { Debug.LogError("没找到该文件 : " + zipPath); } }
也可以参考这位大佬的 https://www.jianshu.com/p/acc3d79d93f7
这种在untiy编辑器下处理的文件,对路径很敏感,不允许有任何中文,包括解压zip时包里面的压缩文件名也不允许有中文,不然就会出现乱码,虽然不能用中文,但也无关紧要了,毕竟路径不用中文就好了嘛 O(∩_∩)O哈哈~
然而,这还不是重点,因为我们的项目始终都是要发布的,不可永远停留在编辑器下,发布出来之后,运行我们的程序无论如何执行这解压缩的方法都是没反映,程序也没崩,打开我们的日志看一下,发现有条报错 ystem.NotSupportedException: CodePage 437 not supported 代码包不支持
后来查了很多资料测试很久才解决......
1.打开unity PlayerSettings,把里面的Scripting Runtime Version 改为 .net4.6,然后重新发布
2.发布完成后,在unity的安装目录下\Editor\Data\Mono\lib\mono\unity,找到 I18N.dll 和 I18N.CJK.dll 两个文件,把他们俩拷贝到发布包 **_Data/Managed目录下。(之前因为发布后读取中文乱码的问题,也是把这两兄弟copy进取就解决的)
这两步完成就可以了,而且在unity编辑器下中文路径乱码的问题也解决了,可以使用中文路径