recomendar uma biblioteca / API para descompactar o arquivo em C #

Parece que não há Biblioteca / API integrada em C # para descompactar um arquivo zip. Eu estou procurando uma biblioteca / API livre (melhor código aberto) que poderia trabalhar com .Net 3.5 + VSTS 2008 + C # para descompactar um arquivo zip e extrair todos os arquivos em uma pasta específica.

Qualquer biblioteca / API ou amostras recomendadas?

A GPL

http://www.icsharpcode.net/OpenSource/SharpZipLib/

OU a menos restritiva Ms-PL

http://www.codeplex.com/DotNetZip

Para completar esta resposta, o framework .net tem o ZipPackage, eu tive menos sucesso com isso.

Se tudo o que você deseja fazer é descompactar o conteúdo de um arquivo em uma pasta e saber que estará executando apenas no Windows, poderá usar o object Shell do Windows. Eu usei dynamic do Framework 4.0 neste exemplo, mas você pode obter os mesmos resultados usando Type.InvokeMember .

 dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items; dynamic destinationFolder = shellApplication.NameSpace(destinationPath); destinationFolder.CopyHere(compressedFolderContents); 

Você pode usar FILEOP_FLAGS para controlar o comportamento do método CopyHere .

O DotNetZip é fácil de usar. Aqui está uma amostra de descompactação

 using (var zip = Ionic.Zip.ZipFile.Read("archive.zip")) { zip.ExtractAll("unpack-directory"); } 

Se você tem necessidades mais complexas, como escolher e escolher quais inputs extrair, ou se há senhas, ou se você quer controlar os nomes dos arquivos extraídos, ou etc etc etc, existem muitas opções . Verifique o arquivo de ajuda para mais exemplos.

DotNetZip é gratuito e de código aberto.

No passado, usei o DotNetZip (MS-PL), o SharpZipLib (GPL) e o 7ZIP SDK para C # (domínio público). Todos eles funcionam muito bem e são de código aberto.

Eu escolheria DotNetZip nessa situação e aqui está um exemplo de código da página C # Examples :

 using (ZipFile zip = ZipFile.Read(ExistingZipFile)) { foreach (ZipEntry e in zip) { e.Extract(TargetDirectory); } } 

Dê uma olhada na minha pequena biblioteca: http://zipstorer.codeplex.com

Se você quiser usar compression 7-zip, confira o artigo EggheadCafe de Peter Bromberg. Cuidado: o código-fonte do LZMA para c # não possui comentários xml (na verdade, poucos comentários).

Se você não quiser usar um componente externo, aqui está um código que desenvolvi ontem à noite usando a class ZipPackage do .NET.

 private static void Unzip() { var zipFilePath = "c:\\myfile.zip"; var tempFolderPath = "c:\\unzipped"; using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) { foreach (PackagePart part in pkg.GetParts()) { var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); var targetDir = target.Remove(target.LastIndexOf('\\')); if (!Directory.Exists(targetDir)) Directory.CreateDirectory(targetDir); using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) { CopyStream(source, File.OpenWrite(target)); } } } } private static void CopyStream(Stream input, Stream output) { byte[] buffer = new byte[4096]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); } } 

Coisas para observar:

  • O arquivo ZIP DEVE ter um arquivo [Content_Types] .xml em sua raiz. Este foi um não-problema para os meus requisitos, como vou controlar a compactação de todos os arquivos ZIP que são extraídos através deste código. Para obter mais informações sobre o arquivo [Content_Types] .xml, consulte: http://msdn.microsoft.com/en-us/magazine/cc163372.aspx Há um arquivo de exemplo abaixo da Figura 13 do artigo.

  • Eu não testei o método CopyStream para garantir que ele se comporte corretamente, pois desenvolvi isso originalmente para o .NET 4.0 usando o método Stream.CopyTo ().

  #region CreateZipFile public void StartZip(string directory, string zipfile_path) { Label1.Text = "Please wait, taking backup"; #region Taking files from root Folder string[] filenames = Directory.GetFiles(directory); // path which the zip file built in ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path)); foreach (string filename in filenames) { FileStream fs = File.OpenRead(filename); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(filename); p.PutNextEntry(entry); p.Write(buffer, 0 , buffer.Length); fs.Close(); } #endregion string dirName= string.Empty; #region Taking folders from root folder DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories); foreach (DirectoryInfo D1 in DI) { // the directory you need to zip filenames = Directory.GetFiles(D1.FullName); if (D1.ToString() == "backup") { filenames = null; continue; } if (dirName == string.Empty) { if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates") { dirName = D1.ToString(); filenames = null; continue; } } else { if (D1.ToString() == dirName) ; } foreach (string filename in filenames) { FileStream fs = File.OpenRead(filename); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(filename); p.PutNextEntry(entry); p.Write(buffer, 0, buffer.Length); fs.Close(); } filenames = null; } p.SetLevel(5); p.Finish(); p.Close(); #endregion } #endregion #region EXTRACT THE ZIP FILE public bool UnZipFile(string InputPathOfZipFile, string FileName) { bool ret = true; Label1.Text = "Please wait, extracting downloaded file"; string zipDirectory = string.Empty; try { #region If Folder already exist Delete it if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field { String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field foreach (var file in files) File.Delete(file); Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field } #endregion if (File.Exists(InputPathOfZipFile)) { string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile); using (ZipInputStream ZipStream = new ZipInputStream(File.OpenRead(InputPathOfZipFile))) { ZipEntry theEntry; while ((theEntry = ZipStream.GetNextEntry()) != null) { if (theEntry.IsFile) { if (theEntry.Name != "") { string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field string[] DirectorySplit = directoryName.Split('\\'); for (int i = 0; i < DirectorySplit.Length - 1; i++) { if (zipDirectory != null || zipDirectory != "") zipDirectory = zipDirectory + @"\" + DirectorySplit[i]; else zipDirectory = zipDirectory + DirectorySplit[i]; } string first = Server.MapPath("~/updates") + @"\" + zipDirectory; if (!Directory.Exists(first)) Directory.CreateDirectory(first); string strNewFile = @"" + baseDirectory + @"\" + directoryName; if (File.Exists(strNewFile)) { continue; } zipDirectory = string.Empty; using (FileStream streamWriter = File.Create(strNewFile)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = ZipStream.Read(data, 0, data.Length); if (size > 0) streamWriter.Write(data, 0, size); else break; } streamWriter.Close(); } } } else if (theEntry.IsDirectory) { string strNewDirectory = @"" + baseDirectory + @"\" + theEntry.Name; if (!Directory.Exists(strNewDirectory)) { Directory.CreateDirectory(strNewDirectory); } } } ZipStream.Close(); } } } catch (Exception ex) { ret = false; } return ret; } #endregion 

Eu preferiria SharpZiplib Por favor, encontre o código de amostra para UnZip Files in .Net C #

Eu recomendaria nosso http://www.rebex.net/zip.net/, mas sou parcial. Faça o download da versão de avaliação e verifique os resources e amostras por conta própria.

O SevenZipSharp é um invólucro do tha 7z.dll e do LZMA SDK, que é de código aberto e gratuito.

 SevenZipCompressor compressor = new SevenZipCompressor(); compressor.CompressionLevel = CompressionLevel.Ultra; compressor.CompressionMethod = CompressionMethod.Lzma; compressor.CompressionMode = CompressionMode.Create; compressor.CompressFiles(...);