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.