Extrair um arquivo ZIP programaticamente pela biblioteca DotNetZip?

Eu tenho uma function que obter um arquivo ZIP e extraí-lo para um diretório (eu uso biblioteca DotNetZip .)

public void ExtractFileToDirectory(string zipFileName, string outputDirectory) { ZipFile zip = ZipFile.Read(zipFileName); Directory.CreateDirectory(outputDirectory); zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently); } 

Meu arquivo ZIP contém vários arquivos e diretórios. Mas eu quero extrair apenas alguns desses arquivos, não todos eles.

Como posso fazer isso funcionar?

Você precisa testar cada ZipEntry para ver se você deseja extraí-lo:

 public void ExtractFileToDirectory(string zipFileName, string outputDirectory) { ZipFile zip = ZipFile.Read(zipFileName); Directory.CreateDirectory(outputDirectory); foreach (ZipEntry e in zip) { // check if you want to extract e or not if(e.FileName == "TheFileToExtract") e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently); } } 

.

 ZipFile zip = ZipFile.Read(zipFileName); //Runs in framework 4.5 

Existe um método ExtractSelectedEntries na class ZipFile. aqui está a assinatura do método.

 public void ExtractSelectedEntries(string selectionCriteria, string directoryPathInArchive, string extractDirectory, ExtractExistingFileAction extractExistingFile) 

Então, no seu programa, você pode simplesmente extrair os arquivos especificados, fornecendo o selectionCriteria.

 public void ExtractFileToDirectory(string zipFileName, string outputDirectory) { ZipFile zip = ZipFile.Read(zipFileName); Directory.CreateDirectory(outputDirectory); zip.ExtractSelectedEntries("name = *.doc", "document\", outputDirectory, ExtractExistingFileAction.OverwriteSilently); } 

Você pode combinar critérios com as conjunções AND ou OR. Usar uma string como “name = * .txt AND size> = 100k” para o selectionCriteria recupera inputs cujos nomes terminam em .txt e cujo tamanho não compactado é maior ou igual a 100 kilobytes.

Aqui estão alguns exemplos de critérios


critérios (arquivos recuperados)

name! = * .xls (qualquer arquivo com uma extensão que não seja .xls)

name = * .mp3 (qualquer arquivo com extensão .mp3)

* .mp3 (o mesmo que acima, qualquer arquivo com extensão .mp3)

attributes = A (todos os arquivos cujos atributos incluem o bit de arquivamento)

atributos! = H (todos os arquivos cujos atributos não incluem o bit oculto)

mtime> 2009-01-01 (todos os arquivos com a última modificação após 1º de janeiro de 2009)

tamanho> 2gb (todos os arquivos cujo tamanho não compactado é maior que 2gb)


Para mais referências, você deve ler o documento da API sozinho com a biblioteca.

Você também pode usar o LINQ para selecionar as inputs que deseja extrair. Por exemplo:

 using (var zip = ZipFile.Read(ArchiveToRead)) { var selection = from e in zip.Entries where System.IO.Path.GetFileName(e.FileName).StartsWith("C") select e; foreach (var e in selection) e.Extract(extractDir); } 

Claro que você pode usar qualquer critério de consulta desejado na cláusula where .