Quando si producono zip di grandi dimensioni è facile che la memoria aumenti troppo. Con SharpZipLib è facile evitare di saturare la memoria.

Ecco un esempio di codice per zippare una cartella:

public static void ZipFilesToDisk(string inputFolderPath, string outputFile, string password)
{
    ArrayList fileNames = GenerateFileList(inputFolderPath); // generate file list

    byte[] buffer = new byte[1024 * 8];

    using (ZipOutputStream zipOutput = new ZipOutputStream(File.Create(outputFile)))
    {
        // set compression level
        zipOutput.SetLevel(9);

        // set password
        if (!String.IsNullOrEmpty(password))
            zipOutput.Password = password;

        foreach (string fileName in fileNames)
        {
            ICSharpCode.SharpZipLib.Zip.ZipEntry zipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(fileName);
            zipOutput.PutNextEntry(zipEntry);
            using (var fread = System.IO.File.OpenRead(fileName))
            {
                StreamUtils.Copy(fread, zipOutput, buffer);
            }
        }
        zipOutput.Finish();
    }
}


Recuperare la lista dei file (c’è di meglio… questo era negli esempi):

private static ArrayList GenerateFileList(string Dir)
{
    ArrayList fils = new ArrayList();
    bool Empty = true;
    foreach (string file in Directory.GetFiles(Dir)) // add each file in directory
    {
        fils.Add(file);
        Empty = false;
    }

    if (Empty)
    {
        if (Directory.GetDirectories(Dir).Length == 0)
        // if directory is completely empty, add it
        {
            fils.Add(Dir + @"/");
        }
    }

    foreach (string dirs in Directory.GetDirectories(Dir)) // recursive
    {
        foreach (object obj in GenerateFileList(dirs))
        {
            fils.Add(obj);
        }
    }
    return fils; // return file list
}

Happy ZIP!