卖女孩的小火柴の

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编辑器下中文路径乱码的问题也解决了,可以使用中文路径

posted on 2018-12-27 17:08  卖女孩の小火柴  阅读(1717)  评论(0编辑  收藏  举报

导航