Creating an In Memory Zip Archive for multiple files in C#

Standard

I was asked an interesting technical question the other day that felt relevant enough to share. Having tackled a similar issue in the distant past using SharpLib this felt like a good opportunity to recreate the functionality using native .Net functionality in the form of ZipArchive!

For this use case the ask was to store various string data that can be appended to an in memory zip archive in form of a new file containing the data. After the data is processed the desire was to write the zip file to a specific location for another process. The following is short proof of concept to outline the implementation.

using System.IO.Compression;
using System.Text;

namespace ZipTest
{
    internal class Program
    {
        /// <summary>
        /// Create a new file to contain the data passed in and then add that to the Zip Archive
        /// </summary>
        /// <param name="archive">The Archive to append to</param>
        /// <param name="fileName">The name of the file as you wish it to appear in the archive</param>
        /// <param name="textContent"></param>
        static void AddFileToZip(ZipArchive archive, string fileName, string textContent)
        {
            // Create a new entry in the archive using the specified file name
            ZipArchiveEntry entry = archive.CreateEntry(fileName);

            // Write the text content to the entry
            using (Stream entryStream = entry.Open())
            using (StreamWriter writer = new StreamWriter(entryStream, Encoding.UTF8))
            {
                writer.Write(textContent);
            }
        }
        // Append the data in the form of a file to the archive
        static void AppendFileToZipArchive(MemoryStream zipStream, string fileName, string textContent)
        {
            // Create a new ZipArchive instance using the existing MemoryStream
            using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update, leaveOpen: true))
            {
                AddFileToZip(archive, fileName, textContent);
            }
        }

        static void SaveZipArchiveToDisk(MemoryStream zipArchiveStream, string outputPath)
        {
            // Save the MemoryStream to a file
            File.WriteAllBytes(outputPath, zipArchiveStream.ToArray());
        }
        static void Main(string[] args)
        {
            using (MemoryStream zipArchiveStream = new MemoryStream())
            {
                // Append files to the zip archive
                AppendFileToZipArchive(zipArchiveStream, "file1.txt", "This is the content of file 1.");
                AppendFileToZipArchive(zipArchiveStream, "file2.txt", "This is the content of file 2.");

                // Save the zip archive to a file
                SaveZipArchiveToDisk(zipArchiveStream, "result.zip");
            }
        }
    }
}

Hopefully you find this useful!

Leave a Reply

Your email address will not be published. Required fields are marked *