Non ho trovato la classe "ZipFile" nello spazio dei nomi "System.IO.Compression"


112

Non riesco a utilizzare la classe "Zipfile" nello spazio dei nomi "System.IO.Compression" il mio codice è:

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

l'errore è:

Il nome "zipfile" non esiste nel contesto corrente

Come posso risolverlo?


Risposte:


213

Hai bisogno di un riferimento extra per questo; il modo più conveniente per eseguire questa operazione è tramite il pacchetto 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 stai lavorando su .NET Framework senza NuGet, devi aggiungere un riferimento dll all'assembly, "System.IO.Compression.FileSystem.dll" e assicurarti di utilizzare almeno .NET 4.5 (poiché non esistono in framework precedenti).

Per informazioni, è possibile trovare l'assembly e le versioni .NET da MSDN


2
Sto usando .NET 4.0 ... e non ho trovato questo file dll
— Mohamed Kamal

17
@ MohamedKamal in effetti, non lo farai a meno che non usi .NET 4.5, dal momento che non esisteva fino ad allora; vedere le informazioni "Informazioni sulla versione" - "Supportato in: 4.5"
— Marc Gravell

1
@ MarcGravell Sto riscontrando lo stesso errore. Ho controllato Visual Studio -> aiuto -> Informazioni su Microsoft Visual Studio, mostra con .NET versione 4.5.51650. Cosa devo controllare dopo?
— foxwendy

4
Non avevo la FileSystemreferenza. Solo System.IO.Compression. Grazie. Strano che richieda un file che non è nello spazio dei nomi della classe. È una strana deviazione dalla convenzione.
— Chris Benard,

3
@ChrisBenard Ho trovato lo stesso problema. Includere un riferimento a System.IO.Compression non era sufficiente, avevo bisogno anche di FileSystem. Davvero interessante.
— dckuehn

32

Per coloro che sono programmatori ecologici in .NET, per aggiungere il riferimento DLL come notato da MarcGravell , seguire questi passaggi:

Per aggiungere un riferimento in Visual C #

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto e fare clic su Aggiungi riferimento.
  2. Nella finestra di dialogo Aggiungi riferimento, selezionare la scheda che indica il tipo di componente a cui si desidera fare riferimento.
  3. Selezionare i componenti a cui si desidera fare riferimento e quindi fare clic su OK.

Dall'articolo MSDN, Procedura: aggiungere o rimuovere riferimenti utilizzando la finestra di dialogo Aggiungi riferimento .


1
Grazie per le informazioni. Avevo già utilizzato System.IO.Compression; ma poi ho dovuto aggiungere un riferimento all'utilizzo di System.IO.Compression.FileSystem come descritto sopra per far sì che ZipFile si compilasse senza l'errore originale dell'OP.
— Hugh Seagraves

17

puoi usare un pacchetto esterno se non puoi aggiornare a 4.5. Uno di questi è Ionic.Zip.dll di DotNetZipLib.

using Ionic.Zip;

puoi scaricarlo qui, è gratuito. http://dotnetzip.codeplex.com/


3
o installalo tramite NuGet
— northben

2
In che modo questo è rilevante per la domanda?
— eugenekgn

20
la sua domanda era "come lo aggiusto?" e questo è un modo per risolverlo, poiché la sua versione di .net non lo supportava.
— John Faulkner

4
Purtroppo, a volte l'aggiornamento non è una scelta. Avere un voto positivo.
— sampathsris

1
Questo è rilevante se stai scrivendo su 2000 PC su cui è installato XP e il tuo programma non può eseguire alcuna installazione (per installare il framework .net 4.5)
— Mukus

10

Basta andare su Riferimenti e aggiungere "System.IO.Compression.FileSystem".


Ho posti illimitati per trovare "Riferimenti". Puoi dare ulteriori suggerimenti su dove trovarlo?
— Daniel Kaplan,

2

Una soluzione che mi ha aiutato: vai su Strumenti> Gestione pacchetti NuGet> Gestisci pacchetti NuGet per soluzione ...> Sfoglia> Cerca System.IO.Compression.ZipFile e installalo


1

So che questo è un vecchio thread, ma non posso evitare di pubblicare alcune informazioni utili su questo. Vedo che la domanda Zip viene fuori spesso e questo risponde quasi alla maggior parte delle domande comuni.

Per aggirare i problemi del framework dell'utilizzo di 4.5 + ... La loro è una classe ZipStorer creata da jaime-olivares: https://github.com/jaime-olivares/zipstorer , ha anche aggiunto un esempio di come utilizzare questa classe come bene e ha anche aggiunto un esempio di come cercare anche un nome di file specifico.

E per riferimento su come usarlo e iterare per una certa estensione di file come esempio, potresti farlo:

#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

Aggiungi System.IO.Compression.ZipFile come riferimento nuget che sta funzionando


0

In Esplora soluzioni, fai clic con il pulsante destro del mouse su Riferimenti, quindi fai clic per espandere gli assembly, trova System.IO.Compression.FileSystem e assicurati che sia selezionato. Quindi puoi usarlo nella tua classe -using System.IO.Compression;

Aggiungi schermata assieme di riferimento


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.