Search code examples
c#compressionzip

Create Zip archive from multiple in memory files in C#


Is there a way to create a Zip archive that contains multiple files, when the files are currently in memory? The files I want to save are really just text only and are stored in a string class in my application. But I would like to save multiple files in a single self-contained archive. They can all be in the root of the archive.

It would be nice to be able to do this using SharpZipLib.


Solution

  • Use ZipEntry and PutNextEntry() for this. The following shows how to do it for a file, but for an in-memory object just use a MemoryStream

    FileStream fZip = File.Create(compressedOutputFile);
    ZipOutputStream zipOStream = new ZipOutputStream(fZip);
    foreach (FileInfo fi in allfiles)
    {
        ZipEntry entry = new ZipEntry((fi.Name));
        zipOStream.PutNextEntry(entry);
        FileStream fs = File.OpenRead(fi.FullName);
        try
        {
            byte[] transferBuffer[1024];
            do
            {
                bytesRead = fs.Read(transferBuffer, 0, transferBuffer.Length);
                zipOStream.Write(transferBuffer, 0, bytesRead);
            }
            while (bytesRead > 0);
        }
        finally
        {
            fs.Close();
        }
    }
    zipOStream.Finish();
    zipOStream.Close();