GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。
本文集以一个小的功能点为单位行文,也便于拾取罢!
简介:
笔者今天推荐的仓库叫 ZipReaderForUnity。
从名字上看,就轻松知道它是 zip 读取工具啦,不过这个仓库有点硬核,因为它里面仅仅有一个脚本。
不过笔者推荐它,是希望对zip 解压有兴趣的可以以此为入口,开启你的大神学习之旅。
功能:
- It does not support zip64.
- It only supports compression method 0x8 which is deflate.
- 由于这个脚本依赖
System.IO.Compression.DeflateStream
,所以不需要引入其他第三方库。
使用:
- 创建实例。
- 调用 Load()加载zip文件,使用 LoadFile() 加载zip中指定的文件。
- 使用 如下 API 获取zip文件内部结构:
- .numFiles - 获取文件数
- .getFiles() - 获取文件列表
- .getFileRecord() - 获取文件记录
- .getFileIndex() - 获取文件索引
演示:
zipReaderTips:
- 演示了读取一个 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,喜欢记得点赞关注哦!
网友评论