作为参数传递时 MemoryStream 不可读
MemoryStream not readable when passed as parameter
昨天我遇到了一个奇怪的问题:当我想将一个 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!
...
}
这两个版本有什么区别?为什么传的第一个VersionMemoryStream
无法读取?
ZipFile.IsZipFile
改变了流的位置——它需要读取超过一个字节的数据。在调用 ImportArchive
:
之前,您需要 "rewind" 流
stream.Position = 0;
这不是可以自动完成的事情 - 当您将某个方法传递给流时,通常假定您指向相关数据的开头。这允许您在一个流中包含不同的数据 "packets",这意味着您可以使用不可搜索的流。
昨天我遇到了一个奇怪的问题:当我想将一个 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!
...
}
这两个版本有什么区别?为什么传的第一个VersionMemoryStream
无法读取?
ZipFile.IsZipFile
改变了流的位置——它需要读取超过一个字节的数据。在调用 ImportArchive
:
stream.Position = 0;
这不是可以自动完成的事情 - 当您将某个方法传递给流时,通常假定您指向相关数据的开头。这允许您在一个流中包含不同的数据 "packets",这意味着您可以使用不可搜索的流。