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

http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx