[
  {
    "Id": "184207",
    "ThreadId": "54634",
    "Html": "I need to be able to unzip nested zip files and only use streams.  Could someone please help me with this. <br>\r\n<br>\r\nExample file:<br>\r\nAAA.zip<br>\r\n-&gt;BBB.xml<br>\r\n-&gt;BBB.zip<br>\r\n-&gt;-&gt;CCC.ZIP<br>\r\n-&gt;-&gt;-&gt;DDD.ZIP<br>\r\n<br>\r\n<br>\r\nWhen I run the code below I get an exception when trying to do ZipFile.Read on the BBB.zip stream. <br>\r\n<br>\r\nMessage: <br>\r\n&quot;Could not read block - no data!  (position 0x000012EC)&quot;<br>\r\n<br>\r\nStackTrace:<br>\r\n&quot;   at Ionic.Zip.SharedUtilities._ReadFourBytes(Stream s, String message)\\r\\n   at Ionic.Zip.SharedUtilities.ReadInt(Stream s)\\r\\n   at Ionic.Zip.ZipFile.VerifyBeginningOfZipFile(Stream s)\\r\\n   at Ionic.Zip.ZipFile.ReadIntoInstance(ZipFile zf)\\r\\n   at Ionic.Zip.ZipFile.Read(Stream zipStream, TextWriter statusMessageWriter, Encoding encoding, EventHandler`1 readProgress)\\r\\n   at Ionic.Zip.ZipFile.Read(Stream zipStream, TextWriter statusMessageWriter, Encoding encoding)\\r\\n   at Ionic.Zip.ZipFile.Read(Stream zipStream)\\r\\n   at SouthernCompany.SupplyChain.ProcessRFQ.Helper.ZipHelper.UnzipStream(Stream inputStream)&quot;<br>\r\n<br>\r\n<br>\r\nHere is a dump of what the variables look like:<br>\r\n<br>\r\n-  <strong>file</strong> {Ionic.Zip.ZipEntry} Ionic.Zip.ZipEntry<br>\r\n+  ActualEncoding null System.Text.Encoding<br>\r\n  BitField 8 short<br>\r\n  Comment null string<br>\r\n  CompressedSize 4744 long<br>\r\n  CompressionMethod 8 short<br>\r\n  CompressionRatio 2.0644095788604488 double<br>\r\n  Crc32 38137106 int<br>\r\n  Encryption None Ionic.Zip.EncryptionAlgorithm<br>\r\n  FileName &quot;BBB.zip&quot; string<br>\r\n  ForceNoCompression false bool<br>\r\n  IsDirectory false bool<br>\r\n+  LastModified {4/22/2009 1:18:36 PM} System.DateTime<br>\r\n  LocalFileName &quot;BBB.zip&quot; string<br>\r\n  OutputUsedZip64 null bool?<br>\r\n  OverwriteOnExtract false bool<br>\r\n+  ProvisionalAlternateEncoding {System.Text.SBCSCodePageEncoding} System.Text.Encoding {System.Text.SBCSCodePageEncoding}<br>\r\n  RequiresZip64 null bool?<br>\r\n  UncompressedSize 4844 long<br>\r\n  UsesEncryption false bool<br>\r\n  UseUnicodeAsNecessary false bool<br>\r\n  VersionNeeded 20 short<br>\r\n  WantCompression null Ionic.Zip.WantCompressionCallback<br>\r\n  WillReadTwiceOnInflation null Ionic.Zip.ReReadApprovalCallback<br>\r\n<br>\r\n-  <strong>tempZip</strong> {System.IO.MemoryStream} System.IO.MemoryStream<br>\r\n+  base {System.IO.MemoryStream} System.IO.Stream {System.IO.MemoryStream}<br>\r\n  CanRead true bool<br>\r\n  CanSeek true bool<br>\r\n  CanWrite true bool<br>\r\n  Capacity 4844 int<br>\r\n  Length 4844 long<br>\r\n  Position 4844 long<br>\r\n<br>\r\n<br>\r\n<span style=\"color:#0000ff;font-size:13px\">public</span><span style=\"font-size:13px\"> </span><span style=\"color:#0000ff;font-size:13px\">bool</span><span style=\"font-size:13px\"> UnzipStream(</span><span style=\"color:#2b91af;font-size:13px\">Stream</span><span style=\"font-size:13px\"> inputStream)\r\n<p>{</p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">    try </span></p>\r\n<span style=\"font-size:13px\">\r\n<p>    {</p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">        bool</span><span style=\"font-size:13px\"> success = </span><span style=\"color:#0000ff;font-size:13px\">true</span><span style=\"font-size:13px\">; </span></p>\r\n<p><span style=\"color:#2b91af;font-size:13px\">        ZipFile</span><span style=\"font-size:13px\"> zip = </span><span style=\"color:#2b91af;font-size:13px\">ZipFile</span><span style=\"font-size:13px\">.Read(inputStream); </span></p>\r\n<p><span style=\"color:#2b91af;font-size:13px\">        MemoryStream</span><span style=\"font-size:13px\"> tempFile = </span><span style=\"color:#0000ff;font-size:13px\">new</span><span style=\"font-size:13px\"> </span><span style=\"color:#2b91af;font-size:13px\">MemoryStream</span><span style=\"font-size:13px\">(); </span></p>\r\n<p><span style=\"color:#2b91af;font-size:13px\">        MemoryStream</span><span style=\"font-size:13px\"> tempZip = </span><span style=\"color:#0000ff;font-size:13px\">new</span><span style=\"font-size:13px\"> </span><span style=\"color:#2b91af;font-size:13px\">MemoryStream</span><span style=\"font-size:13px\">(); </span></p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">        foreach</span><span style=\"font-size:13px\"> (</span><span style=\"color:#2b91af;font-size:13px\">ZipEntry</span><span style=\"font-size:13px\"> file </span><span style=\"color:#0000ff;font-size:13px\">in</span><span style=\"font-size:13px\"> zip)\r\n<p>        {</p>\r\n</span>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">            if</span><span style=\"font-size:13px\"> (file.FileName.ToLower().EndsWith(</span><span style=\"color:#a31515;font-size:13px\">&quot;.zip&quot;</span><span style=\"font-size:13px\">))\r\n<p>            {</p>\r\n<p>                tempZip = </p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">new</span><span style=\"font-size:13px\"> </span><span style=\"color:#2b91af;font-size:13px\">MemoryStream</span><span style=\"font-size:13px\">();\r\n<p>&nbsp;</p>\r\n<p>&nbsp;</p>\r\n<p>                zip.Extract(file.FileName, tempZip);</p>\r\n</span></p>\r\n</p>\r\n<p>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">                if</span><span style=\"font-size:13px\"> (!UnzipStream(tempZip))\r\n<p>                {</p>\r\n<p>                    success = </p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">false</span><span style=\"font-size:13px\">;\r\n<p>&nbsp;</p>\r\n<p>&nbsp;</p>\r\n<p>                }</p>\r\n<p>            }</p>\r\n</span></p>\r\n</p>\r\n<p>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">            else </span></p>\r\n<span style=\"font-size:13px\">\r\n<p>            {</p>\r\n<p>                tempFile = </p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">new</span><span style=\"font-size:13px\"> </span><span style=\"color:#2b91af;font-size:13px\">MemoryStream</span><span style=\"font-size:13px\">();\r\n<p>&nbsp;</p>\r\n<p>&nbsp;</p>\r\n<p>                zip.Extract(file.FileName, tempFile);</p>\r\n</span></p>\r\n<p>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#008000;font-size:13px\">                // Add logic for file </span></p>\r\n<span style=\"font-size:13px\">\r\n<p>            }</p>\r\n<p>        }</p>\r\n<p>        zip.Dispose();</p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">        return</span><span style=\"font-size:13px\"> success;\r\n<p>    }</p>\r\n</span>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">    catch</span><span style=\"font-size:13px\"> (</span><span style=\"color:#2b91af;font-size:13px\">Exception</span><span style=\"font-size:13px\"> ex)\r\n<p>    {</p>\r\n</span>\r\n<p>&nbsp;</p>\r\n</p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">        return</span><span style=\"font-size:13px\"> </span><span style=\"color:#0000ff;font-size:13px\">false</span><span style=\"font-size:13px\">;\r\n<p>    }</p>\r\n<p>}</p>\r\n</span>\r\n<p>&nbsp;</p>\r\n</p>\r\n",
    "PostedDate": "2009-04-27T13:02:20.313-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "184557",
    "ThreadId": "54634",
    "Html": "I fixed the issue. It looks like when the zip file is written to the tempZip MemoryStream the position is set to the end of the stream, so just reset the position to zero.<br>\r\n<br>\r\n<span style=\"font-size:13px\">\r\n<p>zip.Extract(file.FileName, tempZip);</p>\r\n<p>tempZip.Flush();</p>\r\n<p>tempZip.Position = 0;</p>\r\n<p>&nbsp;</p>\r\n</span>\r\n<p><span style=\"color:#0000ff;font-size:13px\">if</span><span style=\"font-size:13px\"> (!UnzipStream(tempZip))\r\n<p>&nbsp;</p>\r\n<p>{</p>\r\n<p>success = </p>\r\n</span></p>\r\n<p><span style=\"color:#0000ff;font-size:13px\">false</span><span style=\"font-size:13px\">;\r\n<p>&nbsp;</p>\r\n<p>}</p>\r\n</span></p>\r\n",
    "PostedDate": "2009-04-28T08:16:36.047-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "184602",
    "ThreadId": "54634",
    "Html": "Ahhh, glad you found the problem.\r\n",
    "PostedDate": "2009-04-28T10:08:51.723-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  }
]