将流复制到byte []不会结束流

时间:2019-03-11 10:12:57

标签: .net stream memorystream ziparchive

我在一个zip文件中有一个zip文件,我需要将内部zip文件存储在byte []类型的对象的属性中。因此,我需要读取内部zipfile并将其转换为byte []。

在下面的代码中,我打开了主要的zip文件,并将ZipArvhiveEntry条目存储为(内部)zip文件,并将其存储在名为apps的列表列表中。

问题是因为我需要在memStream之前调用memStream.ToArray()来获取字节,因此newArchive被关闭,看来我没有得到zip文件字节的最后一部分(好像ZipArchive实际上是在memStream关闭时向其写入内容,但是我无法在不关闭memStream的情况下手动将其关闭。)

如何解决该问题,以便在我的byteArray(名为appBytes)中获得完整的ZipArchive?

  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();
       }
    }
}

0 个答案:

没有答案