Pasta Zip em c #

O que é um exemplo (código simples) de como compactar uma pasta em c #?


Atualizar:

Eu não vejo namespace ICSharpCode . Eu baixei ICSharpCode.SharpZipLib.dll mas eu não sei onde copiar esse arquivo DLL. O que preciso fazer para ver esse namespace?

E você tem link para esse exemplo do MSDN para pasta de compactação, porque eu li todo o MSDN, mas não consegui encontrar nada.


OK, mas preciso da próxima informação.

Onde devo copiar ICSharpCode.SharpZipLib.dll para ver esse namespace no Visual Studio?

Esta resposta muda com o .NET 4.5. Criar um arquivo zip se torna incrivelmente fácil . Nenhuma biblioteca de terceiros será necessária.

 string startPath = @"c:\example\start"; string zipPath = @"c:\example\result.zip"; string extractPath = @"c:\example\extract"; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath); 

No arquivo de ajuda do DotNetZip , http://dotnetzip.codeplex.com/releases/

 using (ZipFile zip = new ZipFile()) { zip.UseUnicodeAsNecessary= true; // utf-8 zip.AddDirectory(@"MyDocuments\ProjectX"); zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ; zip.Save(pathToSaveZipFile); } 

Não há nada na BCL para fazer isso para você, mas existem duas ótimas bibliotecas para .NET que suportam a funcionalidade.

  • SharpZipLib
  • DotNetZip

Eu usei ambos e posso dizer que os dois são muito completos e têm APIs bem projetadas, então é principalmente uma questão de preferência pessoal.

Não tenho certeza se eles suportam explicitamente adicionar pastas em vez de apenas arquivos individuais em arquivos zip, mas deve ser muito fácil criar algo que seja recursivamente repetido em um diretório e em seus subdiretórios usando as classs DirectoryInfo e FileInfo .

No .NET 4.5, o ZipFile.CreateFromDirectory (startPath, zipPath); O método não abrange um cenário em que você deseja compactar vários arquivos e subpastas sem precisar colocá-los em uma pasta. Isto é válido quando você deseja que o unzip coloque os arquivos diretamente dentro da pasta atual.

Este código funcionou para mim:

 public static class FileExtensions { public static IEnumerable AllFilesAndFolders(this DirectoryInfo dir) { foreach (var f in dir.GetFiles()) yield return f; foreach (var d in dir.GetDirectories()) { yield return d; foreach (var o in AllFilesAndFolders(d)) yield return o; } } } void Test() { DirectoryInfo from = new DirectoryInfo(@"C:\Test"); using (FileStream zipToOpen = new FileStream(@"Test.zip", FileMode.Create)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)) { foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast()) { var relPath = file.FullName.Substring(from.FullName.Length+1); ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath); } } } } 

As pastas não precisam ser “criadas” no arquivo zip. O segundo parâmetro “entryName” em CreateEntryFromFile deve ser um caminho relativo e, ao descompactar o arquivo zip, os diretórios dos caminhos relativos serão detectados e criados.

Há uma class ZipPackage no namespace System.IO.Packaging, que é embutido no .NET 3, 3.5 e 4.0.

http://msdn.microsoft.com/pt-br/library/system.io.packaging.zippackage.aspx

Aqui está um exemplo de como usá-lo. http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print

Há um artigo no MSDN que tem um aplicativo de exemplo para compactar e descompactar arquivos e pastas exclusivamente em C #. Eu tenho usado algumas das classs com sucesso por um longo tempo. O código é liberado sob a Licença Permissiva da Microsoft, se você precisar saber esse tipo de coisa.

EDIT: Graças ao Cheeso por apontar que estou um pouco atrás dos tempos. O exemplo do MSDN que eu apontei é na verdade usando DotNetZip e é realmente muito completo em destaque nos dias de hoje. Com base na minha experiência de uma versão anterior do presente eu recomendo alegremente.

SharpZipLib também é uma biblioteca bastante madura e é altamente classificada por pessoas, e está disponível sob a licença GPL. Isso realmente depende das suas necessidades de compactação e de como você visualiza os termos da licença para cada um deles.

Rico

O código a seguir usa um componente ZIP de terceiros da Rebex :

 // add content of the local directory C:\Data\ // to the root directory in the ZIP archive // (ZIP archive C:\archive.zip doesn't have to exist) Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.zip", @"C:\Data\*", ""); 

Ou se você quiser adicionar mais pastas sem precisar abrir e fechar o arquivo várias vezes:

 using Rebex.IO.Compression; ... // open the ZIP archive from an existing file ZipArchive zip = new ZipArchive(@"C:\archive.zip", ArchiveOpenMode.OpenOrCreate); // add first folder zip.Add(@"c:\first\folder\*","\first\folder"); // add second folder zip.Add(@"c:\second\folder\*","\second\folder"); // close the archive zip.Close(ArchiveSaveAction.Auto); 

Você pode baixar o componente ZIP aqui .

O uso de uma SharpZipLib gratuita, licenciada sob LGPL, é uma alternativa comum.

Disclaimer: Eu trabalho para Rebex

"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"

Você precisa adicionar o arquivo dll como referência em seu projeto. Clique com o botão direito do mouse em References no Solution Explorer-> Add Reference-> Browse e selecione a dll.

Por fim, você precisará adicioná-lo como uma instrução de uso nos arquivos em que deseja usá-lo.

O ComponentPro ZIP pode ajudá-lo a realizar essa tarefa. O trecho de código a seguir comprime arquivos e dirs em uma pasta. Você também pode usar a máscara wilcard.

 using ComponentPro.Compression; using ComponentPro.IO; ... // Create a new instance. Zip zip = new Zip(); // Create a new zip file. zip.Create("test.zip"); zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive. // Add all files and subdirectories from 'c:\test' to the archive. zip.AddFiles(@"c:\test"); // Add all files and subdirectories from 'c:\my folder' to the archive. zip.AddFiles(@"c:\my folder", ""); // Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2", "22"); // Add all .dat files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2", "22", "*.dat"); // Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2\*.dat", "22"); // Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22"); TransferOptions opt = new TransferOptions(); // Donot add empty directories. opt.CreateEmptyDirectories = false; zip.AddFiles(@"c:\abc", "/", opt); // Close the zip file. zip.Close(); 

http://www.componentpro.com/doc/zip tem mais exemplos

usando DotNetZip (disponível como pacote nuget):

 public void Zip(string source, string destination) { using (ZipFile zip = new ZipFile { CompressionLevel = CompressionLevel.BestCompression }) { var files = Directory.GetFiles(source, "*", SearchOption.AllDirectories). Where(f => Path.GetExtension(f). ToLowerInvariant() != ".zip").ToArray(); foreach (var f in files) { zip.AddFile(f, GetCleanFolderName(source, f)); } var destinationFilename = destination; if (Directory.Exists(destination) && !destination.EndsWith(".zip")) { destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.zip"; } zip.Save(destinationFilename); } } private string GetCleanFolderName(string source, string filepath) { if (string.IsNullOrWhiteSpace(filepath)) { return string.Empty; } var result = filepath.Substring(source.Length); if (result.StartsWith("\\")) { result = result.Substring(1); } result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length); return result; } 

Uso:

 Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest"); 

Ou

 Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.zip");