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?


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


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 .


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/


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".


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


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();
}


1

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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.