首页 > 解决方案 > TriLib SharpZipLib.Zip.ZipEntry - 无法访问 GetInputStream() 的封闭流

问题描述

(这是使用 Unity 2020.1.4f1 和 Trilib 2.0.9 模型加载器)

我正在尝试从 zipStream 中提取字节(以将其加载bytes[]Texture2D.LoadImage()Unity 中)。你怎么做到这一点?

这是我尝试过的以及我得到的错误:

我收到错误消息:“无法访问已关闭的流。” for Stream zipStream = zipFile.GetInputStream(e)where ea ZipEntryfrom a ZipFile(由闭源 sdk 产生)


 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, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }

e在循环中提取 - 如果这很重要

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

ObjectDisposedException: Cannot access a closed Stream.
System.IO.MemoryStream.Seek (System.Int64 offset, System.IO.SeekOrigin loc) (at <fb001e01371b4adca20013e0ac763896>:0)
ICSharpCode.SharpZipLib.Zip.ZipFile.TestLocalHeader (ICSharpCode.SharpZipLib.Zip.ZipEntry entry, ICSharpCode.SharpZipLib.Zip.ZipFile+HeaderTest tests) (at <1a5a474a643a454ba874ca384c215100>:0)
ICSharpCode.SharpZipLib.Zip.ZipFile.LocateEntry (ICSharpCode.SharpZipLib.Zip.ZipEntry entry) (at <1a5a474a643a454ba874ca384c215100>:0)
ICSharpCode.SharpZipLib.Zip.ZipFile.GetInputStrea

标签: c#unity3dsharpziplib

解决方案


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

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

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

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


推荐阅读