Criar um ficheiro Zip em C#
Uma forma rápida de criarmos um ficheiro Zip, é recorrendo à classe ZipPackage do WindowsBase.dll.
Para tal, precisamos de adicionar a referencia a esta dll ao nosso projecto, que no meu caso está em “C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0ProfileClientWindowsBase.dll”.
Podemos criar agora uma classe com um método para criar o ficheiro Zip com os ficheiros que queremos.
public static void CreateZipFile(string zipFilename, List<string> files, CompressionOption compression, bool deleteFilesAfterZip) { long bsize = 4096; byte[] b = new byte[bsize]; int bytesRead = ; long bytesWritten = ; using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) { foreach (string file in files) { Uri uri = PackUriHelper.CreatePartUri(new Uri(file, UriKind.Absolute)); if (zip.PartExists(uri)) zip.DeletePart(uri); PackagePart part = zip.CreatePart(uri, "", compression); using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) { using (Stream dest = part.GetStream()) { while ((bytesRead = stream.Read(b, , b.Length)) != ) { dest.Write(b, , bytesRead); bytesWritten += bsize; } } } } } if (deleteFilesAfterZip) DeleteFiles(files); }
Adicionei um parametro (deleteFilesAfterZip) que vai remover todos os ficheiros que foram incluidos no Zip, apenas para me facilitar o trabalho, mas não é obrigatório.
A função DeleteFiles() será algo parecido com isto:
private static void DeleteFiles(List<string> files) { foreach (string file in files) { FileInfo f = new FileInfo(file); if (!f.Exists) throw new FileNotFoundException(); f.Delete(); } }
Por fim, para chamarmos a função que cria o ficheiro Zip basta um simples
ZIP.CreateZipFile("c:xpto.zip", new List<string>() { "c:xpto.txt", "c:xpto1.txt" }, System.IO.Packaging.CompressionOption.Normal, false);
Referências:
http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx
http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx