【问题标题】:TriLib SharpZipLib.Zip.ZipEntry - Cannot access a closed Stream for GetInputStream()TriLib SharpZipLib.Zip.ZipEntry - 无法访问 GetInputStream() 的封闭流
【发布时间】:2020-11-03 18:44:35
【问题描述】:

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

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

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

我收到错误消息:“无法访问已关闭的流。”对于Stream zipStream = zipFile.GetInputStream(e) 其中eZipEntry 来自 一个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

【问题讨论】:

  • 我不熟悉 Unity 的东西,但我仍然希望看到您使用的完整方法,以便了解如何获取和传递流。
  • 我所拥有的只是 ZipFile 作为一个对象 - 我能够迭代它以获得它的 ZipEntry,而 e.Name 似乎可以工作......也许问题是你怎么样打开ZipFile 以提取单个ZipEntry 流?
  • 那么,你想打开一个压缩文件并从中读取单个文件,对吗?
  • 我不确定您将如何从 ZipFile 对象创建 ZipFile。它不直接接受构造函数中的 zipfile 对象来克隆它。

标签: c# unity3d sharpziplib


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢调试!作为一名自学成才的程序员,了解其他人如何调试情况确实很有帮助。
【解决方案2】:

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

【讨论】:

  • 我一开始没用就试过了。同样的错误。添加以防万一
  • 如何重新打开ZipFile
  • @ina 你是如何创建 ZipFile 的?您是否正在发送已经关闭的流?或者处理你的 ZipFile?
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2011-12-15
  • 2016-11-20
  • 2013-04-11
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多