Скопировать поток в байт [], не получая конец потока - PullRequest
0 голосов
/ 11 марта 2019

У меня есть zip-файлы в zip-файле, и мне нужно хранить внутренние zip-файлы в свойстве объекта типа byte [].Поэтому мне нужно прочитать внутренние zip-файлы и преобразовать их в byte [].

В приведенном ниже коде я открыл основные zip-файлы и сохранил записи ZipArvhiveEntry, которые являются (внутренними) zip-файлами, в списке List с именемapps.

Проблема в том, что мне нужно вызвать memStream.ToArray (), чтобы получить байты до memStream, и, следовательно, newArchive закрыт, кажется, что я не получаю последнюю часть байтов zip-файла (этокажется, что ZipArchive действительно записывает что-то в memStream, когда он закрывается, но у меня нет возможности вручную закрыть его, не закрывая memStream).

Как я могу решить эту проблему, чтобы я получил полный ZipArchive вмой byteArray (с именем appBytes)?

  foreach (ZipArchiveEntry app in apps) {
  byte[] appBytes;
  using (MemoryStream memStream = new MemoryStream()){
    using (Stream innerAppStream = app.Open()) {
      using (ZipArchive newArchive = new ZipArchive(memStream, ZipArchiveMode.Create)){              
      using (ZipArchive readArchive = new ZipArchive(innerAppStream, ZipArchiveMode.Read)){
         foreach (var readEntry in readArchive.Entries){                                                                   
              ZipArchiveEntry newArchiveEntry = newArchive.CreateEntry(readEntry.Name);                                                                    
              using (Stream newArchiveEntryStream = newArchiveEntry.Open()){                                                                        
                 using (StreamWriter writer = new StreamWriter(newArchiveEntryStream)){                                                                            
                   using (Stream readEntryStream = readEntry.Open()){                                                                                
                    using (var reader = new StreamReader(readEntryStream)){                                                                                    
                      string input = reader.ReadToEnd();
                      writer.WriteLine(input);                                                                                    
                      writer.Flush();
                    }
                   }
                }                                                                    
              }                                             
            }                                                            
          }                                                            
         memStream.Flush();
         memStream.Seek(0, SeekOrigin.Begin);                                                  
         appBytes = memStream.ToArray();
       }
    }
}
...