TriLib SharpZipLib.Zip.ZipEntry-无法访问GetInputStream的关闭流

问题描述

(这是将Unity 2020.1.4f1与Trilib 2.0.9 Model Loader一起使用)

我正在尝试从zipStream中提取字节(以将bytes[]加载到Unity中的Texture2D.LoadImage()中)。你如何做到的?

这是我尝试过的和出现的错误

我收到错误消息:“无法访问关闭的流”。对于Stream zipStream = zipFile.GetInputStream(e),其中e是来自{ ZipEntry(由封闭式SDK产生)

ZipFile

Stream zipStream = zipFile.GetInputStream(e); // error occurs here tex.LoadImage(ReadFully(zipStream)); tex.Apply(); public static byte[] ReadFully(Stream input) { byte[] buffer = new byte[16 * 1024]; using (MemoryStream ms = new MemoryStream()) { int read; while ((read = input.Read(buffer,buffer.Length)) > 0) { ms.Write(buffer,read); } return ms.ToArray(); } } 在循环中提取-如果重要的话

e
foreach (ZipEntry e in zipFile)
        {
            if (e.IsFile)
            { ... 

解决方法

因此,我们在聊天中讨论了该问题,而ZipFile的问题是,它不包含文件名,也没有Stream。从技术上讲,这意味着我们无法在ZipFile对象中获取单个文件的流。

场景:他们正在使用TriLib并传递服务器上可用的zip文件的URL。 TriLib所做的是,它获取文件和信息,将其解析为一个对象,并在完成后将该对象返回给方法。

问题ZipFile对象不包含有关单个文件及其Stream的信息,也没有名称,因此Name属性为空。这意味着我们无法对ZipFile对象执行任何操作。

解决方案:我们制作了一个自定义下载器,将文件下载到磁盘上,然后将下载的文件传递给ZipFile构造函数,通过这种方法,我们将所有信息都存储在内部一个zip文件。

,

我相信问题在于每个zip条目的输入流都连接到整个文件的输入流。关闭该流将导致文件流关闭。删除条目流周围的using,我相信您的代码应该可以使用。