No encontré la clase "ZipFile" en el espacio de nombres "System.IO.Compression"

111

No puedo usar la clase "Zipfile" en el espacio de nombres "System.IO.Compression" mi código es:

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

el error es:

El nombre 'zipfile' no existe en el contexto actual

¿Cómo puedo solucionarlo?

Mohamed Kamal
fuente
ver .NET 4.5 de
gerryLowry

Respuestas:

212

Necesita una referencia adicional para esto; la forma más conveniente de hacerlo es a través del paquete 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" />

Si está trabajando en .NET Framework sin NuGet, debe agregar una referencia dll al ensamblado, "System.IO.Compression.FileSystem.dll", y asegurarse de que está utilizando al menos .NET 4.5 (ya que no existen en marcos anteriores).

Para obtener información, puede encontrar el ensamblado y las versiones de .NET en MSDN

Marc Gravell
fuente
2
Estoy usando .NET 4.0 ... y no encontré este archivo dll
Mohamed Kamal
17
@MohamedKamal de hecho, no lo hará a menos que use .NET 4.5, ya que no existía hasta entonces; consulte la información de "Información de la versión" - "Compatible en: 4.5"
Marc Gravell
1
@MarcGravell Tengo el mismo error. Revisé Visual Studio -> ayuda -> Acerca de Microsoft Visual Studio, se muestra con la versión .NET 4.5.51650. ¿Qué debo comprobar a continuación?
foxwendy
4
No tenía la FileSystemreferencia. Sólo System.IO.Compression. Gracias. Es extraño que requiera un archivo que no está en el espacio de nombres de la clase. Es una extraña desviación de la convención.
Chris Benard
3
@ChrisBenard Encontré el mismo problema. Incluir una referencia a System.IO.Compression no era suficiente, también necesitaba FileSystem. Interesante en verdad.
dckuehn
32

Para aquellos que son programadores ecológicos en .NET, para agregar la referencia de DLL como señaló MarcGravell , siga estos pasos:

Para agregar una referencia en Visual C #

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto y haga clic en Agregar referencia.
  2. En el cuadro de diálogo Agregar referencia, seleccione la pestaña que indica el tipo de componente al que desea hacer referencia.
  3. Seleccione los componentes a los que desea hacer referencia y luego haga clic en Aceptar.

En el artículo de MSDN, Cómo: Agregar o quitar referencias mediante el cuadro de diálogo Agregar referencia .

Will Ediger
fuente
1
Gracias por la info. Ya había usado System.IO.Compression; pero luego tuve que agregar una referencia al uso de System.IO.Compression.FileSystem como describió anteriormente para que ZipFile se compile sin el error original del OP.
Hugh Seagraves
17

puede usar un paquete externo si no puede actualizar a 4.5. Uno de ellos es Ionic.Zip.dll de DotNetZipLib.

using Ionic.Zip;

puedes descargarlo aquí, es gratis. http://dotnetzip.codeplex.com/

John Faulkner
fuente
3
o instalarlo a través de NuGet
northben
2
¿Cómo es esto relevante para la pregunta?
Eugenekgn
20
su pregunta era "¿cómo lo soluciono?" y esta es una forma de solucionarlo, ya que su versión de .net no lo admitía.
John Faulkner
4
Lamentablemente, la actualización no es una opción a veces. Tener un voto a favor.
sampathsris
1
Esto es relevante si está escribiendo en 2000 PC que tienen XP instalado y su programa no puede realizar ninguna instalación (para instalar .net 4.5 framework)
Mukus
10

Simplemente vaya a Referencias y agregue "System.IO.Compression.FileSystem".

usuario6604144
fuente
Tengo lugares ilimitados para encontrar "Referencias". ¿Puede dar más pistas sobre dónde encontrar esto?
Daniel Kaplan
2

Una solución que me ayudó: vaya a Herramientas> Administrador de paquetes NuGet> Administrar NuGet Packaged for Solution ...> Examinar> Busque System.IO.Compression.ZipFile e instálelo

Hanssss
fuente
1

Sé que este es un hilo antiguo, pero no puedo evitar publicar información útil sobre esto. Veo que la pregunta de Zip surge mucho y esto responde casi a la mayoría de las preguntas comunes.

Para sortear los problemas del framework de usar 4.5 + ... Hay una clase ZipStorer creada por jaime-olivares: https://github.com/jaime-olivares/zipstorer , también ha agregado un ejemplo de cómo usar esta clase como bien y también ha agregado un ejemplo de cómo buscar un nombre de archivo específico.

Y como referencia sobre cómo usar esto e iterar para una determinada extensión de archivo como ejemplo, puede hacer esto:

#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
fuente
1

System.IO.Compressionahora está disponible como un paquete nuget mantenido por Microsoft.

Para usarlo ZipFile, debe descargar el System.IO.Compression.ZipFile paquete nuget .

Michał Jarzyna
fuente
1

Agregue System.IO.Compression.ZipFile como referencia nuget, está funcionando

prathesh p
fuente
0

En el explorador de soluciones, haga clic con el botón derecho en Referencias, luego haga clic para expandir ensamblados, busque System.IO.Compression.FileSystem y asegúrese de que esté marcado. Entonces puedes usarlo en tu clase -using System.IO.Compression;

Agregar captura de pantalla de ensamblaje de referencia

Erik Rausch
fuente