Ich habe die Klasse "ZipFile" im Namespace "System.IO.Compression" nicht gefunden

111

Ich kann die Klasse "Zipfile" nicht im Namensraum "System.IO.Compression" verwenden. Mein Code lautet:

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

Der Fehler ist:

Der Name 'zipfile' existiert im aktuellen Kontext nicht

Wie kann ich das lösen?

Mohamed Kamal
quelle
siehe Rick Strahls .NET 4.5 ist ein
direkter

Antworten:

212

Sie benötigen hierfür eine zusätzliche Referenz. Der bequemste Weg, dies zu tun, ist über das NuGet-Paket 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" />

Wenn Sie mit .NET Framework ohne NuGet arbeiten, müssen Sie der Assembly "System.IO.Compression.FileSystem.dll" einen DLL-Verweis hinzufügen - und sicherstellen, dass Sie mindestens .NET 4.5 verwenden (da dies nicht der Fall ist) in früheren Frameworks existieren).

Für Informationen finden Sie die Assembly- und .NET-Version (en) von MSDN

Marc Gravell
quelle
2
Ich benutze .NET 4.0 ... und ich habe diese DLL-Datei nicht gefunden
Mohamed Kamal
17
@MohamedKamal in der Tat, Sie werden es nicht tun, wenn Sie .NET 4.5 verwenden, da es bis dahin nicht existierte; siehe die "Versionsinformationen" info - "Unterstützt in: 4.5"
Marc Gravell
1
@MarcGravell Ich habe den gleichen Fehler. Ich habe Visual Studio -> Hilfe -> Über Microsoft Visual Studio überprüft. Es wird mit .NET Version 4.5.51650 angezeigt. Was soll ich als nächstes überprüfen?
Foxwendy
4
Ich hatte keine FileSystemReferenz. Nur System.IO.Compression. Vielen Dank. Seltsam, dass eine Datei erforderlich ist, die sich nicht im Namespace der Klasse befindet. Es ist eine merkwürdige Abweichung von der Konvention.
Chris Benard
3
@ ChrisBenard Ich habe das gleiche Problem gefunden. Ein Verweis auf System.IO.Compression war nicht genug, ich brauchte auch FileSystem. In der Tat interessant.
Dckuehn
32

Wenn Sie in .NET grüne Programmierer sind , führen Sie die folgenden Schritte aus , um die DLL-Referenz wie von MarcGravell angegeben hinzuzufügen :

So fügen Sie eine Referenz in Visual C # hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten und klicken Sie auf Referenz hinzufügen.
  2. Wählen Sie im Dialogfeld Referenz hinzufügen die Registerkarte aus, auf der der Komponententyp angegeben ist, auf den Sie verweisen möchten.
  3. Wählen Sie die Komponenten aus, auf die Sie verweisen möchten, und klicken Sie dann auf OK.

Aus dem MSDN-Artikel : Gewusst wie: Hinzufügen oder Entfernen von Referenzen mithilfe des Dialogfelds Referenz hinzufügen .

Will Ediger
quelle
1
Danke für die Information. Ich hatte bereits System.IO.Compression; Dann musste jedoch ein Verweis auf die Verwendung von System.IO.Compression.FileSystem wie oben beschrieben hinzugefügt werden, damit ZipFile ohne den ursprünglichen Fehler des OP kompiliert werden konnte.
Hugh Seagraves
17

Sie können ein externes Paket verwenden, wenn Sie kein Upgrade auf 4.5 durchführen können. Eine davon ist Ionic.Zip.dll von DotNetZipLib.

using Ionic.Zip;

Sie können es hier kostenlos herunterladen. http://dotnetzip.codeplex.com/

John Faulkner
quelle
3
oder installieren Sie es über NuGet
Northben
2
Wie ist das für die Frage relevant?
Eugenekgn
20
Seine Frage war: "Wie kann ich das beheben?" und dies ist eine Möglichkeit, das Problem zu beheben, da seine Version von .net dies nicht unterstützte.
John Faulkner
4
Leider ist ein Upgrade manchmal keine Wahl. Habe eine Gegenstimme.
Sampathsris
1
Dies ist relevant, wenn Sie auf 2000 PCs schreiben, auf denen XP installiert ist, und Ihr Programm keine Installation durchführen kann (um das .net 4.5-Framework zu installieren)
Mukus
9

Gehen Sie einfach zu Referenzen und fügen Sie "System.IO.Compression.FileSystem" hinzu.

user6604144
quelle
Ich habe unbegrenzte Orte, um "Referenzen" zu finden. Können Sie weitere Hinweise geben, wo Sie diese finden können?
Daniel Kaplan
2

Eine Lösung, die mir geholfen hat: Gehen Sie zu Tools> NuGet Package Manager> NuGet Packaged for Solution verwalten ...> Durchsuchen> Nach System.IO.Compression.ZipFile suchen und installieren

Hanssss
quelle
1

Ich weiß, dass dies ein alter Thread ist, aber ich kann mich einfach nicht davon abhalten, nützliche Informationen dazu zu veröffentlichen. Ich sehe, dass die Zip-Frage häufig auftaucht, und dies beantwortet fast die meisten häufig gestellten Fragen.

Um Framework-Probleme bei der Verwendung von 4.5 + zu umgehen ... Es handelt sich um eine ZipStorer-Klasse, die von jaime-olivares erstellt wurde: https://github.com/jaime-olivares/zipstorer . Er hat auch ein Beispiel für die Verwendung dieser Klasse als hinzugefügt gut und hat auch ein Beispiel hinzugefügt, wie man auch nach einem bestimmten Dateinamen sucht.

Als Referenz zur Verwendung und zum Durchlaufen einer bestimmten Dateierweiterung als Beispiel können Sie Folgendes tun:

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

System.IO.Compressionist jetzt als Nuget-Paket verfügbar , das von Microsoft verwaltet wird.

Zur Verwendung müssen ZipFileSie das System.IO.Compression.ZipFile Nuget-Paket herunterladen .

Michał Jarzyna
quelle
1

Fügen Sie System.IO.Compression.ZipFile als Nuget-Referenz hinzu, die gerade funktioniert

prathesh p
quelle
0

Klicken Sie im Lösungs-Explorer mit der rechten Maustaste auf Referenzen, und klicken Sie dann auf, um Assemblys zu erweitern. Suchen Sie System.IO.Compression.FileSystem und stellen Sie sicher, dass es aktiviert ist. Dann können Sie es in Ihrer Klasse verwenden -using System.IO.Compression;

Screenshot der Referenzbaugruppe hinzufügen

Erik Rausch
quelle
0

Das Problem hierbei ist, dass Sie gerade den Verweis auf System.IO.Compression hinzugefügt haben. Es fehlt der Verweis auf System.IO.Compression.Filesystem.dll

Und Sie müssen dies unter .net 4.5 oder höher tun (da es in älteren Versionen nicht vorhanden ist).

Ich habe gerade ein Skript auf TechNet gepostet. Vielleicht würde es jemand nützlich finden, für den .net 4.5 oder 4.7 erforderlich ist

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

Jose Ortega
quelle