Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unzip a memorystream (Contains the zip file) and get the files

Tags:

c#

I have a memory stream that contains a zip file in byte[] format. Is there any way I can unzip this memory stream, without any need of writing the file to disk?

In general I am using ICSharpCode.SharpZipLib.Zip.FastZip to unzip a file, but is there any way to unzip a memory stream, maybe by storing the files in another MemoryStream or in byte[] format according to the files/folders present in the zip?

Any way I can use the Memorymapped files feature in this scenario ?

like image 422
Deepak Jena Avatar asked Oct 03 '12 20:10

Deepak Jena


2 Answers

Yes, .Net 4.5 now supports more Zip functionality.

Here is a code example based on your description.

In your project, right click on the References folder and add a reference to System.IO.Compression

using System.IO.Compression;  Stream data = new MemoryStream(); // The original data Stream unzippedEntryStream; // Unzipped data from a file in the archive  ZipArchive archive = new ZipArchive(data); foreach (ZipArchiveEntry entry in archive.Entries) {     if(entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))     {          unzippedEntryStream = entry.Open(); // .Open will return a stream          // Process entry data here     } } 

Hope this helps.

like image 128
gigaduck Avatar answered Oct 26 '22 23:10

gigaduck


We use DotNetZip, and I can unzip the contents of a zip file from a Stream into memory. Here's the sample code for extracting a specifically named file from a stream (LocalCatalogZip) and returning a stream to read that file, but it'd be easy to expand on it.

private static MemoryStream UnZipCatalog() {     MemoryStream data = new MemoryStream();     using (ZipFile zip = ZipFile.Read(LocalCatalogZip))     {         zip["ListingExport.txt"].Extract(data);     }     data.Seek(0, SeekOrigin.Begin);     return data; } 

It's not the library you're using now, but if you can change, you can get that functionality.


Here's a variation which would return a Dictionary<string,MemoryStream> of for the contents of every file of a zip file.

private static Dictionary<string,MemoryStream> UnZipToMemory() {     var result = new Dictionary<string,MemoryStream>();     using (ZipFile zip = ZipFile.Read(LocalCatalogZip))     {         foreach (ZipEntry e in zip)         {             MemoryStream data = new MemoryStream();             e.Extract(data);             result.Add(e.FileName, data);         }     }      return result; } 
like image 44
Bobson Avatar answered Oct 26 '22 23:10

Bobson