2016-05-10 6 views
0

Gestern bestanden hatte ich ein seltsames Problem: Wenn ich eine ZIP-Datei als byte[] und lesen Sie es passieren wollte, ich eine bekam Ionic.Zip.ZipExpceptionMemory nicht lesbar, wenn sie als Parameter

kann nicht lesen, dass als 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 
    ... 
} 

Nun, wenn ich die byte[] als Parameter und nicht die MemoryStream passieren, funktioniert alles einwandfrei:

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! 
    ... 
} 

Wo liegt der Unterschied zwischen diesen beiden Versionen? Warum kann die erste Version des übergebenen MemoryStream nicht gelesen werden?

+4

Haben Sie versucht, die Speicher-Stream-Position auf 0 zu setzen, bevor Sie 'ImportArchive' aufrufen? – Chrisi

+0

Vielleicht ändert 'ZipFile.IsZipFile (stream)' die Stream-Position. Versuchen Sie, vor dem Lesen in der 'ImportArchive (MemoryStream s)' -Methode auf 0 zu setzen. –

Antwort

1

ZipFile.IsZipFile ändert die Stream-Position - es muss mehr als ein Byte Daten lesen. Sie müssen den Strom „zurückspulen“ vor dem Aufruf ImportArchive zu:

stream.Position = 0; 

Das ist nicht etwas, das automatisch durchgeführt werden kann - wenn Sie eine Methode einen Strom passieren, ist es in der Regel ist davon ausgegangen, dass Sie an den Anfang der du zeigen relevante Daten. Auf diese Weise können Sie verschiedene Datenpakete in einem Stream haben. Dies bedeutet, dass Sie Streams verwenden können, die nicht suchbar sind.

Verwandte Themen