Não encontrei a classe “ZipFile” no namespace “System.IO.Compression”

112

Não consigo usar a classe "Zipfile" no namespace "System.IO.Compression", meu código é:

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"c:\example\start";
            string zipPath = @"c:\example\result.zip";
            string extractPath = @"c:\example\extract";

            ZipFile.CreateFromDirectory(startPath, zipPath, CompressionLevel.Fastest,true);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

o erro é:

O nome 'arquivo zip' não existe no contexto atual

Como posso resolver isso?

Mohamed Kamal
fonte
veja o .NET 4.5 de
gerryLowry

Respostas:

213

Você precisa de uma referência extra para isso; a maneira mais conveniente de fazer isso é por meio do pacote NuGet System.IO.Compression.ZipFile

<!-- Version here correct at time of writing, but please check for latest -->
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />

Se você estiver trabalhando no .NET Framework sem NuGet, você precisa adicionar uma referência dll ao assembly, "System.IO.Compression.FileSystem.dll" - e garantir que está usando pelo menos .NET 4.5 (já que não existem em estruturas anteriores).

Para obter informações, você pode encontrar o assembly e a (s) versão (ões) .NET no MSDN

Marc Gravell
fonte
2
Estou usando o .NET 4.0 ... e não encontrei este arquivo dll
Mohamed Kamal
17
@MohamedKamal de fato, você não o fará a menos que use o .NET 4.5, já que ele não existia até então; consulte as informações de "Informações da versão" - "Compatível com: 4.5"
Marc Gravell
1
@MarcGravell Estou tendo o mesmo erro. Verifiquei o Visual Studio -> ajuda -> Sobre o Microsoft Visual Studio, ele mostra a versão .NET 4.5.51650. O que devo verificar a seguir?
foxwendy
4
Eu não tinha a FileSystemreferência. Apenas System.IO.Compression. Obrigado. Estranho que requer um arquivo que não está no namespace da classe. É um desvio estranho da convenção.
Chris Benard
3
@ChrisBenard Eu encontrei o mesmo problema. Incluir uma referência a System.IO.Compression não era suficiente, eu precisava de FileSystem também. Realmente interessante.
dckuehn
32

Para aqueles que são programadores verdes em .NET, para adicionar a referência de DLL como MarcGravell observou, siga estas etapas:

Para adicionar uma referência no Visual C #

  1. No Solution Explorer, clique com o botão direito do mouse no nó do projeto e clique em Add Reference.
  2. Na caixa de diálogo Adicionar Referência, selecione a guia que indica o tipo de componente que você deseja fazer referência.
  3. Selecione os componentes que deseja referenciar e clique em OK.

Do artigo MSDN, Como: Adicionar ou Remover Referências Usando a Caixa de Diálogo Adicionar Referência .

Will Ediger
fonte
1
Obrigado pela informação. Eu já tinha usando System.IO.Compression; mas então teve que adicionar uma referência ao uso de System.IO.Compression.FileSystem como você descreveu acima para fazer o ZipFile compilar sem o erro original do OP.
Hugh Seagraves
17

você pode usar um pacote externo se não conseguir atualizar para 4.5. Um deles é o Ionic.Zip.dll de DotNetZipLib.

using Ionic.Zip;

você pode baixá-lo aqui, é grátis. http://dotnetzip.codeplex.com/

John Faulkner
fonte
3
ou instale-o através do NuGet
northben
2
Como isso é relevante para a pergunta?
eugenekgn
20
sua pergunta era "como faço para corrigir isso?" e esta é uma maneira de consertá-lo - já que sua versão do .net não era compatível.
John Faulkner
4
Infelizmente, às vezes a atualização não é uma escolha. Tenha um voto positivo.
sampathsris
1
Isso é relevante se você estiver gravando em 2.000 PCs com XP instalado e seu programa não puder fazer nenhuma instalação (para instalar o .net 4.5 framework)
Mukus
10

Basta ir para Referências e adicionar "System.IO.Compression.FileSystem".

user6604144
fonte
Tenho lugares ilimitados para encontrar "Referências". Você pode dar mais dicas de onde encontrar isso?
Daniel Kaplan
2

Uma solução que me ajudou: Vá para Ferramentas> Gerenciador de pacotes NuGet> Gerenciar o pacote NuGet para solução ...> Navegar> Pesquisar System.IO.Compression.ZipFile e instale-o

Hanssss
fonte
1

Eu sei que este é um tópico antigo, mas não posso deixar de postar algumas informações úteis sobre isso. Eu vejo a pergunta Zip surgir muito e isso responde quase a maioria das perguntas comuns.

Para contornar problemas de estrutura de usar 4.5 + ... Sua classe ZipStorer criada por jaime-olivares: https://github.com/jaime-olivares/zipstorer , ele também adicionou um exemplo de como usar esta classe como bem e também adicionou um exemplo de como pesquisar um nome de arquivo específico.

E para referência sobre como usar isso e iterar para uma determinada extensão de arquivo como exemplo, você pode fazer isso:

#region
/// <summary>
/// Custom Method - Check if 'string' has '.png' or '.PNG' extension.
/// </summary>
static bool HasPNGExtension(string filename)
{
    return Path.GetExtension(filename).Equals(".png", StringComparison.InvariantCultureIgnoreCase)
        || Path.GetExtension(filename).Equals(".PNG", StringComparison.InvariantCultureIgnoreCase);
}
#endregion

private void button1_Click(object sender, EventArgs e)
{
    //NOTE: I recommend you add path checking first here, added the below as example ONLY.
    string ZIPfileLocationHere = @"C:\Users\Name\Desktop\test.zip";
    string EXTRACTIONLocationHere = @"C:\Users\Name\Desktop";

    //Opens existing zip file.
    ZipStorer zip = ZipStorer.Open(ZIPfileLocationHere, FileAccess.Read);

    //Read all directory contents.
    List<ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir();

    foreach (ZipStorer.ZipFileEntry entry in dir)
    {
        try
        {
            //If the files in the zip are "*.png or *.PNG" extract them.
            string path = Path.Combine(EXTRACTIONLocationHere, (entry.FilenameInZip));
            if (HasPNGExtension(path))
            {
                //Extract the file.
                zip.ExtractFile(entry, path);
            }
        }
        catch (InvalidDataException)
        {
            MessageBox.Show("Error: The ZIP file is invalid or corrupted");
            continue;
        }
        catch
        {
            MessageBox.Show("Error: An unknown error ocurred while processing the ZIP file.");
            continue;
        }
    }
    zip.Close();
}
Burgo855
fonte
1

System.IO.Compressionagora está disponível como um pacote nuget mantido pela Microsoft.

Para usar, ZipFilevocê precisa baixar o System.IO.Compression.ZipFile pacote nuget .

Michał Jarzyna
fonte
1

Adicione System.IO.Compression.ZipFile como referência nuget que está funcionando

prathesh p
fonte
0

No explorador de soluções, clique com o botão direito em References e, em seguida, clique para expandir os assemblies, localize System.IO.Compression.FileSystem e certifique-se de que esteja marcado. Então você pode usá-lo em sua aula -using System.IO.Compression;

Adicionar Captura de Tela de Montagem de Referência

Erik Rausch
fonte
0

O problema aqui é que você acabou de adicionar a referência a System.IO.Compression, mas está faltando a referência a System.IO.Compression.Filesystem.dll

E você precisa fazer isso em .net 4.5 ou posterior (porque não existe em versões anteriores).

Acabei de postar um script no TechNet Talvez alguém ache útil, pois requer .net 4.5 ou 4.7

https://gallery.technet.microsoft.com/scriptcenter/Create-a-Zip-file-from-a-b23a7530

Jose Ortega
fonte