作为参数传递时 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",这意味着您可以使用不可搜索的流。