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

时间:2016-05-10 06:41:25

标签: c# memorystream dotnetzip

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

  

无法将其读作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的第一个版本?

1 个答案:

答案 0 :(得分:1)

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

stream.Position = 0;

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