Nie znalazłem klasy „ZipFile” w przestrzeni nazw „System.IO.Compression”


112

Nie mogę użyć klasy „Zipfile” w przestrzeni nazw „System.IO.Compression”. Mój kod to:

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

błąd to:

Nazwa „zipfile” nie istnieje w obecnym kontekście

Jak mogę to rozwiązać?


Odpowiedzi:


213

Potrzebujesz do tego dodatkowego odniesienia; Najwygodniej jest to zrobić za pomocą pakietu 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" />

Jeśli pracujesz w .NET Framework bez NuGet, musisz dodać odwołanie dll do zestawu „System.IO.Compression.FileSystem.dll” - i upewnić się, że używasz co najmniej .NET 4.5 (ponieważ nie istnieją we wcześniejszych frameworkach).

Aby uzyskać informacje, można znaleźć wersję zestawu i .NET w witrynie MSDN


2
Używam .NET 4.0 ... i nie znalazłem tego pliku dll
Mohamed Kamal

17
@MohamedKamal rzeczywiście, nie zrobisz tego, chyba że używasz .NET 4.5, ponieważ nie istniał wcześniej; zobacz informacje „Informacje o wersji” - „Obsługiwane w: 4.5”
Marc Gravell

1
@MarcGravell Mam ten sam błąd. Sprawdziłem Visual Studio -> pomoc -> O Microsoft Visual Studio, pokazuje się z .NET w wersji 4.5.51650. Co mam teraz sprawdzić?
foxwendy

4
Nie miałem FileSystemodniesienia. Tylko System.IO.Compression. Dzięki. Dziwne, że wymaga pliku, którego nie ma w przestrzeni nazw klasy. To dziwne odstępstwo od konwencji.
Chris Benard,

3
@ChrisBenard Znalazłem ten sam problem. Włączenie odwołania do System.IO.Compression nie wystarczyło, potrzebowałem również FileSystem. Rzeczywiście interesujące.
dckuehn

32

Dla tych, którzy są ekologicznymi programistami w .NET, dodaj referencję DLL jako MarcGravell zauważył , wykonaj następujące kroki:

Aby dodać odwołanie w Visual C #

  1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy węzeł projektu i kliknij opcję Dodaj odniesienie.
  2. W oknie dialogowym Dodaj odniesienie wybierz kartę wskazującą typ komponentu, do którego chcesz się odwołać.
  3. Wybierz komponenty, do których chcesz się odwołać, a następnie kliknij OK.

Z artykułu MSDN, jak: Dodawanie lub usuwanie odwołań za pomocą okna dialogowego Dodaj odwołanie .


1
Dzięki za informację. Już używałem System.IO.Compression; ale potem musiałem dodać odniesienie do używania System.IO.Compression.FileSystem, jak opisano powyżej, aby ZipFile skompilował się bez pierwotnego błędu OP.
Hugh Seagraves

17

możesz użyć zewnętrznego pakietu, jeśli nie możesz zaktualizować do wersji 4.5. Jednym z nich jest Ionic.Zip.dll z DotNetZipLib.

using Ionic.Zip;

możesz go pobrać tutaj, jest bezpłatny. http://dotnetzip.codeplex.com/


3
lub zainstaluj go przez NuGet
northben

2
Jak to ma związek z pytaniem?
eugenekgn

20
jego pytanie brzmiało „jak to naprawić?” i to jest jeden ze sposobów, aby to naprawić - ponieważ jego wersja .net go nie obsługiwała.
John Faulkner

4
Niestety, czasami uaktualnienie nie jest wyborem. Głos za.
sampathsris

1
Jest to istotne, jeśli piszesz do 2000 komputerów PC z zainstalowanym XP i Twój program nie może wykonać żadnej instalacji (aby zainstalować framework .net 4.5)
Mukus

10

Po prostu przejdź do References i dodaj „System.IO.Compression.FileSystem”.


Mam nieograniczone miejsca, w których mogę znaleźć „Referencje”. Czy możesz podać więcej wskazówek, gdzie to znaleźć?
Daniel Kaplan,

2

Rozwiązanie, które mi pomogło: przejdź do pozycji Narzędzia> Menedżer pakietów NuGet> Zarządzaj pakietem NuGet w poszukiwaniu rozwiązania ...> Przeglądaj> Wyszukaj System.IO.Compression.ZipFile i zainstaluj go


1

Wiem, że to stary wątek, ale po prostu nie mogę odejść od publikowania przydatnych informacji na ten temat. Widzę, że często pojawia się pytanie Zip, które odpowiada prawie na większość typowych pytań.

Aby obejść problemy z ramami związane z używaniem 4.5 + ... Ich jest klasą ZipStorer stworzoną przez jaime-olivares: https://github.com/jaime-olivares/zipstorer , dodał również przykład, jak używać tej klasy jako dobrze, a także dodał przykład wyszukiwania określonej nazwy pliku.

Aby uzyskać informacje na temat tego, jak tego używać i iterować dla określonego rozszerzenia pliku, możesz to zrobić:

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



0

W eksploratorze rozwiązań kliknij prawym przyciskiem myszy References, a następnie kliknij, aby rozwinąć zestawy, znajdź System.IO.Compression.FileSystem i upewnij się, że jest zaznaczony. Następnie możesz użyć go w swojej klasie -using System.IO.Compression;

Zrzut ekranu dodawania zestawu odniesienia


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.