gpt4 book ai didi

c# - 作为参数传递时,MemoryStream 不可读

转载 作者:行者123 更新时间:2023-12-03 09:16:29 24 4
gpt4 key购买 nike

昨天我遇到了一个奇怪的问题:当我想将 zip 文件作为 byte[] 传递并读取它时,我得到了一个 Ionic.Zip.ZipExpception

Cannot read that as a ZipFile

public string Import(byte[] file)
{
try
{
var stream = new MemoryStream(file);
if (ZipFile.IsZipFile(stream))
{
ImportArchive(stream);
} else {
...
}
...
}

private void ImportArchive(MemoryStream stream)
{
var zip = ZipFile.Read(stream); //--> ZipException thrown
...
}

现在,如果我传递 byte[] 作为参数而不是 MemoryStream,一切都会正常工作:

public string Import(byte[] file)
{
try
{
if (ZipFile.IsZipFile(new MemoryStream(file), true))
{
ImportArchive(file);
} else {
...
}
...
}

private void ImportArchive(byte[] file)
{
var fileStream = new MemoryStream(file);
var zip = ZipFile.Read(fileStream); //--> no exception!
...
}

这两个版本的区别在哪里?为什么无法读取传入的MemoryStream的第一个版本?

最佳答案

ZipFile.IsZipFile 更改流位置 - 它需要读取多个字节的数据。您需要在调用 ImportArchive 之前“倒带”流:

stream.Position = 0;

这不是可以自动完成的事情 - 当您将某个方法传递给流时,通常假设您指向相关数据的开头。这允许您在一个流中拥有不同的数据“数据包”,这意味着您可以使用不可查找的流。

关于c# - 作为参数传递时,MemoryStream 不可读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com