Откройте внутренний zip-файл, не распаковывая внутреннюю zip-запись

Мы используем DotNetZipLib для обработки zip-файлов.

У меня есть zip-файл, который содержит другой zip-файл, содержащий много (больших) файлов.

outerZipFile.zip
  -> foo.ext
  -> innerZipFile    
      -> file 1
      -> file 2
  -> bar.ext

Я хочу открыть внутренний zip-файл, без чтения всей записи в памяти одновременно или извлечения на жесткий диск. Я не нашел способа открыть внутреннюю запись как поток, потому что это вызывает исключение:

public void Foo(Stream source)
{  
  using (var zip = ZipFile.Read(source))
  {
    foreach (var entry in zip.Entries)
    {
      if (entry.FileName != "innerZipFile")
      {
        continue;
      }
      var stream = entry.OpenReader();
      // throws 'Ionic.Zip.ZipException'
      // Cannot read that as a ZipFile
      var innerZip = ZipFile.Read(stream);
    }
  }
}

Есть ли способ открыть внутренний почтовый индекс из потока без чтения полных данных?

Моя цель — прочитать только некоторые из внутренних записей, не извлекая весь внутренний почтовый индекс (даже в память), потому что внутренний почтовый индекс может содержать до 1 ГБ данных.


person DerApe    schedule 18.01.2017    source источник
comment
Если я не ошибаюсь, вы не можете искать внутри zip-файла, вы должны распаковать его в память или на диск. Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь, так как я хотел бы узнать иначе. Принятый ответ в в этом ответе есть пример, но я не могу проверить, работает ли он.   -  person Equalsk    schedule 18.01.2017
comment
@Equalsk Да, я тоже это нашел, но это извлечет весь контент в поток памяти (как вы сказали), и мы говорим о паре 100 МБ, которых я пытаюсь избежать   -  person DerApe    schedule 18.01.2017
comment
Возможный дубликат Как читать данные из zip-файла, не распаковывая весь файл   -  person TheLethalCoder    schedule 18.01.2017
comment
Может быть, вы могли бы извлечь внутренний zip-файл как поток, затем открыть другой экземпляр ZipFile из потока и прочитать его содержимое как другой поток?   -  person stuartd    schedule 18.01.2017
comment
Обратите внимание, что в приведенном выше дублировании некоторые ответы показывают использование чтения определенных файлов либо в память, либо на диск. Затем вы можете использовать этот новый поток или файл для извлечения или ввода zip, как обычно.   -  person TheLethalCoder    schedule 18.01.2017
comment
@TheLethalCoder Я знаю, но, как я уже сказал в вопросе, я не хочу извлекать все данные (даже в память), а скорее читать их как поток. Моя цель - извлечь только некоторые файлы внутреннего zip без необходимости читать все внутренние записи.   -  person DerApe    schedule 18.01.2017
comment
@derape Мне удалось заставить его работать, используя стандартную библиотеку .NET, но я считаю, что он считывает все в память ...   -  person TheLethalCoder    schedule 18.01.2017
comment
Вы хотите, чтобы я выложил решение, которое мне нужно просмотреть, даже если оно, скорее всего, считывает все в память? Видя, как вы говорите, ваш код выдает исключение.   -  person TheLethalCoder    schedule 18.01.2017
comment
@TheLethalCoder Если вы уверены, что ваше решение готово все в память, то в этом нет необходимости, в противном случае продолжайте и опубликуйте его :-)   -  person DerApe    schedule 19.01.2017