TriLib SharpZipLib.Zip.ZipEntry - 无法访问 GetInputStream() 的已关闭流
TriLib SharpZipLib.Zip.ZipEntry - Cannot access a closed Stream for GetInputStream()
(这是使用 Unity 2020.1.4f1 和 Trilib 2.0.9 模型加载器)
我正在尝试从 zipStream 中提取字节(将 bytes[]
加载到 Unity 中的 Texture2D.LoadImage()
中)。你是怎么做到的?
这是我尝试过的方法和我遇到的错误:
I'm getting the error: "Cannot access a closed Stream." for Stream zipStream = zipFile.GetInputStream(e)
where e
is a ZipEntry
from
a ZipFile
(produced by a closed-source 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
我认为问题在于每个 zip 条目的输入流都连接到整个文件的输入流。关闭该流会导致文件流关闭。删除入口流周围的 using,我相信您的代码应该可以工作。
所以,我们在聊天中讨论了这个问题,ZipFile
的问题是,它不包含文件名,也没有 Stream
。从技术上讲,我们无法获取 ZipFile
对象中单个文件的流。
场景: 他们正在使用 TriLib
并传递服务器上可用的 zip 文件的 URL。 TriLib
所做的是,它获取文件和信息,将其解析为一个对象,并在完成后将该对象返回到一个方法中。
问题: ZipFile
对象不包含有关单个文件及其 Stream
的信息,也没有名称,因此 Name
属性 即将变为空。这意味着,我们无法对 ZipFile
对象执行任何操作。
解决方案:我们制作了一个自定义下载器并将文件下载到磁盘上,然后将下载的文件传递给ZipFile
构造函数,通过使用这种方法,我们有压缩文件中的所有信息。
(这是使用 Unity 2020.1.4f1 和 Trilib 2.0.9 模型加载器)
我正在尝试从 zipStream 中提取字节(将 bytes[]
加载到 Unity 中的 Texture2D.LoadImage()
中)。你是怎么做到的?
这是我尝试过的方法和我遇到的错误:
I'm getting the error: "Cannot access a closed Stream." for
Stream zipStream = zipFile.GetInputStream(e)
wheree
is aZipEntry
from aZipFile
(produced by a closed-source 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
我认为问题在于每个 zip 条目的输入流都连接到整个文件的输入流。关闭该流会导致文件流关闭。删除入口流周围的 using,我相信您的代码应该可以工作。
所以,我们在聊天中讨论了这个问题,ZipFile
的问题是,它不包含文件名,也没有 Stream
。从技术上讲,我们无法获取 ZipFile
对象中单个文件的流。
场景: 他们正在使用 TriLib
并传递服务器上可用的 zip 文件的 URL。 TriLib
所做的是,它获取文件和信息,将其解析为一个对象,并在完成后将该对象返回到一个方法中。
问题: ZipFile
对象不包含有关单个文件及其 Stream
的信息,也没有名称,因此 Name
属性 即将变为空。这意味着,我们无法对 ZipFile
对象执行任何操作。
解决方案:我们制作了一个自定义下载器并将文件下载到磁盘上,然后将下载的文件传递给ZipFile
构造函数,通过使用这种方法,我们有压缩文件中的所有信息。