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?

Mohamed Kamal
la source
voir .NET 4.5 de
gerryLowry

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

Marc Gravell
la source
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 .

Will Ediger
la source
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/

John Faulkner
la source
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".

user6604144
la source
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

Hanssss
la source
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();
}
Burgo855
la source
1

System.IO.Compressionest désormais disponible en tant que package nuget géré par Microsoft.

Pour l'utiliser, ZipFilevous devez télécharger le System.IO.Compression.ZipFile package nuget .

Michał Jarzyna
la source
1

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

prathesh p
la source
0

Dans l'explorateur de solutions, cliquez avec le bouton droit sur Références, puis cliquez pour développer les assemblys, recherchez System.IO.Compression.FileSystem et assurez-vous qu'il est coché. Ensuite, vous pouvez l'utiliser dans votre classe -using System.IO.Compression;

Ajouter une capture d'écran d'assemblage de référence

Erik Rausch
la source
0

Le problème ici est que vous venez d'ajouter la référence à System.IO.Compression, il manque la référence à System.IO.Compression.Filesystem.dll

Et vous devez le faire sur .net 4.5 ou version ultérieure (car il n'existe pas sur les anciennes versions).

Je viens de publier un script sur TechNet Peut-être que quelqu'un trouverait cela utile, il nécessite .net 4.5 ou 4.7

https://gallery.technet.microsoft.com/scriptcenter/Create-a-Zip-file-from-a-b23a7530

José Ortega
la source