Je n'ai pas trouvé la classe «ZipFile» dans l'espace de noms «System.IO.Compression»


112

Je ne peux pas utiliser la classe "Zipfile" dans l'espace de nom "System.IO.Compression" mon code est:

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'erreur est:

Le nom 'zipfile' n'existe pas dans le contexte actuel

Comment puis-je le résoudre?


Réponses:


213

Vous avez besoin d'une référence supplémentaire pour cela; le moyen le plus pratique de le faire est d'utiliser le package 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 vous travaillez sur .NET Framework sans NuGet, vous devez ajouter une référence dll à l'assembly, «System.IO.Compression.FileSystem.dll» - et vous assurer que vous utilisez au moins .NET 4.5 (car il ne existent dans les cadres précédents).

Pour plus d'informations, vous pouvez trouver l'assembly et la (les) version (s) .NET de MSDN


2
J'utilise .NET 4.0 ... et je n'ai pas trouvé ce fichier dll
Mohamed Kamal

17
@MohamedKamal en effet, vous ne le ferez que si vous utilisez .NET 4.5, car il n'existait pas jusque-là; voir les informations "Informations sur la version" - "Supporté dans: 4.5"
Marc Gravell

1
@MarcGravell J'ai la même erreur. J'ai vérifié Visual Studio -> aide -> À propos de Microsoft Visual Studio, il s'affiche avec la version 4.5.51650 .NET. Que dois-je vérifier ensuite?
foxwendy

4
Je n'avais pas la FileSystemréférence. Seulement System.IO.Compression. Merci. Bizarre que cela nécessite un fichier qui ne se trouve pas dans l'espace de noms de la classe. C'est un étrange écart par rapport aux conventions.
Chris Benard

3
@ChrisBenard J'ai trouvé le même problème. Inclure une référence à System.IO.Compression n'était pas suffisant, j'avais également besoin de FileSystem. Intéressant en effet.
dckuehn

32

Pour ceux qui sont des programmeurs verts dans .NET, pour ajouter la référence DLL comme MarcGravell l'a noté, procédez comme suit:

Pour ajouter une référence dans Visual C #

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet et cliquez sur Ajouter une référence.
  2. Dans la boîte de dialogue Ajouter une référence, sélectionnez l'onglet indiquant le type de composant à référencer.
  3. Sélectionnez les composants que vous souhaitez référencer, puis cliquez sur OK.

À partir de l'article MSDN, Comment: ajouter ou supprimer des références à l'aide de la boîte de dialogue Ajouter une référence .


1
Merci pour l'info. J'avais déjà utilisé System.IO.Compression; mais a ensuite dû ajouter une référence à l'utilisation de System.IO.Compression.FileSystem comme vous l'avez décrit ci-dessus pour que ZipFile compile sans l'erreur d'origine de l'OP.
Hugh Seagraves

17

vous pouvez utiliser un package externe si vous ne pouvez pas passer à la version 4.5. L'un d'eux est Ionic.Zip.dll de DotNetZipLib.

using Ionic.Zip;

vous pouvez le télécharger ici, c'est gratuit. http://dotnetzip.codeplex.com/


3
ou installez-le via NuGet
northben

2
En quoi est-ce pertinent par rapport à la question?
eugenekgn

20
sa question était "comment puis-je résoudre ce problème?" et c'est une façon de le réparer - puisque sa version de .net ne le supportait pas.
John Faulkner

4
Malheureusement, la mise à niveau n'est parfois pas un choix. Ayez un vote favorable.
sampathsris

1
Ceci est pertinent si vous écrivez sur 2000 PC sur lesquels XP est installé et que votre programme ne peut effectuer aucune installation (pour installer le framework .net 4.5)
Mukus

10

Allez simplement dans Références et ajoutez "System.IO.Compression.FileSystem".


J'ai des endroits illimités pour trouver des «références». Pouvez-vous donner plus d'indices pour savoir où trouver cela?
Daniel Kaplan

2

Une solution qui m'a aidé: Allez dans Outils> Gestionnaire de packages NuGet> Gérer NuGet Packaged pour la solution ...> Parcourir> Rechercher System.IO.Compression.ZipFile et installez-le


1

Je sais que c'est un vieux fil de discussion, mais je ne peux tout simplement pas éviter de publier des informations utiles à ce sujet. Je vois que la question Zip revient souvent et cela répond presque à la plupart des questions courantes.

Pour contourner les problèmes de framework liés à l'utilisation de 4.5 + ... Il s'agit d'une classe ZipStorer créée par jaime-olivares: https://github.com/jaime-olivares/zipstorer , il a également ajouté un exemple d'utilisation de cette classe comme et a également ajouté un exemple sur la façon de rechercher un nom de fichier spécifique.

Et pour savoir comment l'utiliser et parcourir une certaine extension de fichier à titre d'exemple, vous pouvez le faire:

#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

Ajoutez System.IO.Compression.ZipFile comme référence nuget, il fonctionne



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.