Estou tentando descompactar programaticamente um arquivo compactado.
Eu tentei usar a System.IO.Compression.GZipStream
classe no .NET, mas quando meu aplicativo é executado (na verdade, um teste de unidade), recebo esta exceção:
System.IO.InvalidDataException: o número mágico no cabeçalho GZip não está correto. Verifique se você está passando em um fluxo GZip.
Agora percebo que um .zip
arquivo não é o mesmo que um .gz
arquivo, e que GZip
não é o mesmo que Zip
.
No entanto, como eu posso extrair o arquivo clicando duas vezes manualmente no arquivo compactado e, em seguida, clicando no botão "Extrair todos os arquivos", acho que também deve haver uma maneira de fazer isso no código.
Portanto, eu tentei usar Process.Start()
com o caminho para o arquivo compactado como entrada. Isso faz com que meu aplicativo abra uma janela mostrando o conteúdo do arquivo compactado. Tudo bem, mas o aplicativo será instalado em um servidor sem ninguém por perto para clicar no botão "Extrair todos os arquivos".
Então, como faço para que meu aplicativo extraia os arquivos nos arquivos compactados?
Ou existe outra maneira de fazer isso? Prefiro fazê-lo em código, sem baixar aplicativos ou bibliotecas de terceiros; o departamento de segurança não gosta muito disso ...
Respostas:
Usamos o SharpZipLib com sucesso em muitos projetos. Sei que é uma ferramenta de terceiros, mas o código-fonte está incluído e pode fornecer algumas dicas se você optar por reinventar a roda aqui.
fonte
Com o .NET 4.5, você pode descompactar arquivos usando a estrutura .NET:
O código acima foi obtido diretamente da documentação da Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
está contido na montagemSystem.IO.Compression.FileSystem
. (Obrigado nateirvin ... veja o comentário abaixo)fonte
ZipFile
está contido na montagemSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Alguma coisa sobre isso?Para .Net 4.5+
Nem sempre é desejado gravar o arquivo descompactado no disco. Como desenvolvedor do ASP.Net, eu teria que mexer nas permissões para conceder direitos para o meu aplicativo gravar no sistema de arquivos. Ao trabalhar com fluxos na memória, posso contornar tudo isso e ler os arquivos diretamente:
Como alternativa, você ainda pode gravar o arquivo descompactado no disco chamando
ExtractToFile()
:Para usar a
ZipArchive
classe, você precisará adicionar uma referência aoSystem.IO.Compression
espaço para nome e aoSystem.IO.Compression.FileSystem
.fonte
ZipArchive
objeto se encaixa perfeitamente.foreach
loop paraExtractToFile
quando posso usarZipFile.ExtractToDirectory(inputFile, outputDir);
Qual é a vantagem do primeiro método?Grátis e sem arquivos DLL externos. Tudo está em um arquivo CS. Um download é apenas o arquivo CS, outro download é um exemplo muito fácil de entender. Tentei hoje e não acredito como a configuração foi simples. Funcionou na primeira tentativa, sem erros, sem nada.
https://github.com/jaime-olivares/zipstorer
fonte
Use a biblioteca DotNetZip em http://www.codeplex.com/DotNetZip
fonte
Para usar a classe ZipFile, você deve adicionar uma referência ao assembly System.IO.Compression.FileSystem no seu projeto
fonte
Arquivos zip padrão normalmente usam o algoritmo deflate.
Para extrair arquivos sem usar bibliotecas de terceiros, use DeflateStream. Você precisará de um pouco mais de informações sobre o formato de arquivo compactado, pois a Microsoft fornece apenas o algoritmo de compactação.
Você também pode tentar usar o zipfldr.dll. É a biblioteca de compactação da Microsoft (pastas compactadas no menu Enviar para). Parece ser uma biblioteca de com mas não documentada. Você poderá fazê-lo funcionar por meio de experimentação.
fonte
Eu uso isso para compactar ou descompactar vários arquivos. O material Regex não é obrigatório, mas eu o uso para alterar o carimbo de data e remover os sublinhados indesejados. Eu uso a string vazia na string Compress >> zipPath para prefixar algo em todos os arquivos, se necessário. Além disso, costumo comentar Compress () ou Decompress () com base no que estou fazendo.
fonte
Isso fará isso
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
fonte
A partir daqui :
fonte
Você pode fazer tudo isso no .NET 3.5 usando DeflateStream. O que falta no .NET 3.5 é a capacidade de processar as seções do cabeçalho do arquivo usadas para organizar os arquivos compactados. O PKWare publicou essas informações, que você pode usar para processar o arquivo zip depois de criar as estruturas usadas. Não é particularmente oneroso e é uma boa prática na criação de ferramentas sem o uso de código de terceiros.
Não é uma resposta de uma linha, mas é completamente factível se você estiver disposto e apto a dedicar algum tempo. Eu escrevi uma aula para fazer isso em algumas horas e o que obtive disso é a capacidade de compactar e descompactar arquivos usando apenas o .NET 3.5.
fonte
Descobri esse (pacote de descompactação no NuGet) hoje, desde que deparei com um bug no DotNetZip, e percebi que não havia realmente tanto trabalho no DotNetZip nos últimos dois anos.
O pacote Unzip é enxuto e funcionou para mim - não tinha o bug que o DotNetZip tinha. Além disso, era um arquivo razoavelmente pequeno, contando com o Microsoft BCL para a descompactação real. Eu poderia facilmente fazer os ajustes necessários (para acompanhar o progresso durante a descompressão). Eu recomendo.
fonte
De recursos incorporados:
fonte
Até agora, eu estava usando processos cmd para extrair um arquivo .iso, copiá-lo para um caminho temporário do servidor e extraído em um pendrive. Recentemente, descobri que isso está funcionando perfeitamente com .iso's com menos de 10 GB. Para um iso como 29Gb, esse método fica preso de alguma forma.
fonte
você pode usar o Info-descompactar a linha de comando cod.you só precisa baixar o unzip.exe no site oficial do Info-unzip.
fonte