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!