Search code examples
c#.netziparchive

How to read file from ZIP archive to memory without extracting it to file first, by using C# .NET 4.5?


.NET Framework 4.5 added support for ZIP files via classes in System.IO.Compression.

Let's say I have .ZIP archive that has sample.xml file in the root. I want to read this file directly from archive to memory stream and then deserialize it to a custom .NET object. What is the best way to do this?


Solution

  • Adapted from the ZipArchive and XmlSerializer.Deserialize() manual pages.

    The ZipArchiveEntry class has an Open() method, which returns a stream to the file.

    string zipPath = @"c:\example\start.zip";
    
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))
    {
        var sample = archive.GetEntry("sample.xml");
        if (sample != null)
        {
            using (var zipEntryStream = sample.Open())
            {               
                XmlSerializer serializer = new XmlSerializer(typeof(SampleClass));  
    
                SampleClass deserialized = 
                    (SampleClass)serializer.Deserialize(zipEntryStream);
            }
        }
    } 
    

    Note that, as documented on MSDN, you need to add a reference to the .NET assembly System.IO.Compression.FileSystem in order to use the ZipFile class.