2016-05-10 2 views
0

Вчера у меня была странная проблема: Когда я хотел передать файл почтового индекса, как byte[] и прочитать его, я получил Ionic.Zip.ZipExpceptionMemoryStream не читается, когда в качестве параметра

не может прочитать, что как 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?

+4

Пробовал ли вы настройку потока потоков памяти на 0, прежде чем вы вызовете 'ImportArchive'? – Chrisi

+0

Возможно, 'ZipFile.IsZipFile (поток)' изменяет положение потока. Перед чтением попробуйте установить его в 0 в свой метод 'ИмпортArchive (MemoryStream s)'. –

ответ

1

ZipFile.IsZipFile изменяет положение потока - ему необходимо прочитать более одного байта данных. Вы должны «перемотать» поток перед вызовом ImportArchive:

stream.Position = 0; 

Это не то, что может быть сделано автоматически - при передаче какой-либо метод потока, это обычно предполагается, что вы направляете к началу Соответствующие данные. Это позволяет вам иметь разные «пакеты» данных в одном потоке, а это означает, что вы можете использовать потоки, которые не доступны для поиска.

Смежные вопросы