问题描述
(这是将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,我相信您的代码应该可以使用。