美文网首页unitycsharpC#
[Unity 3d] ZipReader For Unity

[Unity 3d] ZipReader For Unity

作者: 雨落随风 | 来源:发表于2019-06-11 23:06 被阅读2次

    GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。
    本文集以一个小的功能点为单位行文,也便于拾取罢!

    简介:

    笔者今天推荐的仓库叫 ZipReaderForUnity
    从名字上看,就轻松知道它是 zip 读取工具啦,不过这个仓库有点硬核,因为它里面仅仅有一个脚本。
    不过笔者推荐它,是希望对zip 解压有兴趣的可以以此为入口,开启你的大神学习之旅。

    功能:

    • It does not support zip64.
    • It only supports compression method 0x8 which is deflate.
    • 由于这个脚本依赖System.IO.Compression.DeflateStream,所以不需要引入其他第三方库。

    使用:

    1. 创建实例。
    2. 调用 Load()加载zip文件,使用 LoadFile() 加载zip中指定的文件。
    3. 使用 如下 API 获取zip文件内部结构:
      • .numFiles - 获取文件数
      • .getFiles() - 获取文件列表
      • .getFileRecord() - 获取文件记录
      • .getFileIndex() - 获取文件索引

    演示:

    zipReader

    Tips:

    • 演示了读取一个 248MB的 zip 文件。
    • 演示了 输出文件名 API
    • 演示了 常规读取 和 开线程读取。
    • 演示了 释放文件 的API:Dispose (如果不是为了演示谁愿意手动点击释放呢?)

    以下为演示代码:

    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Threading;
    using UnityEngine;
    using Zip;
    
    public class TestReadZip : MonoBehaviour
    {
        ZipReader reader;
        public string zipName;
        public bool printFileName = false;
        void Start()
        {
            reader = new ZipReader();
        }
    
        public void JieYa()
        {
            Debug.Log("Begin");
            reader.load(Path.Combine(Application.dataPath, zipName + ".zip"));
            Debug.Log(reader.numFiles);
            ListFileNames();
        }
    
        bool finish= false;
        public void JieyaAsyn()
        {
            Debug.Log("Begin");
            finish = false; //重置标识位
            string path = Path.Combine(Application.dataPath, zipName + ".zip");
            Thread thread = new Thread(() =>
            {
                reader.load(path);
                finish = true;
            });
            thread.Start();
            StartCoroutine(PrintIfFinished());
        }
    
        IEnumerator PrintIfFinished()
        {
            yield return 0; //延迟到下一帧,线程开的有点慢
            while (!finish)
            {
                print("解压中..."); //注意:如果没释放zip就点了异步加载zip ,会一直输出 ‘解压中’ ,哈哈哈~~
                yield return null;
            }
            Debug.Log("Finish");
            Debug.Log(reader.numFiles);
            ListFileNames();
        }
    
        private void ListFileNames() //枚举文件名
        {
            if (printFileName)
            {
                List<string> files = reader.getFiles();
                for (int i = 0; i < files.Count; i++)
                {
                    if (i % 8 == 0) //输出数据采取抽查模式,避免大数据输出导致的卡顿
                    {
                        Debug.Log("File :" + files[i]);
                    }
                }
            }
        }
        public void Close()
        {
            Debug.Log("释放文件!");
            reader.Dispose(); //释放zip文件。避免被占用
        }
    
        public void ShowFiles()
        {
            printFileName = !printFileName;
            Debug.Log(printFileName?"输出文件列表":"不输出文件列表");
        }
    
        Vector3 vector = new Vector3(0, 1, 0);
        void Update()
        {
            transform.Rotate(vector, Space.Self);
        }
    }
    
    

    方法名必须很任性。

    链接:

    NegInfinity/ZipReaderForUnity: Basic Zip file reader, originally written for unity engine.

    结语:

    all the data used for creating the writer was taken off wikipedia article about zip files. - 所有关于 zip 解压的数据来自于 wiki 百科。
    所以推荐大家瞅瞅,向这个仓库作者学习学习怎么拾取人家的知识变为自己的。

    本文集持续更新ing,喜欢记得点赞关注哦!

    相关文章

      网友评论

        本文标题:[Unity 3d] ZipReader For Unity

        本文链接:https://www.haomeiwen.com/subject/uqxhfctx.html