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ć?

Mohamed Kamal
źródło
zobacz .NET 4.5
gerryLowry

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

Marc Gravell
źródło
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 .

Will Ediger
źródło
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/

John Faulkner
źródło
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”.

user6604144
źródło
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

Hanssss
źródło
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();
}
Burgo855
źródło
1

System.IO.Compressionjest teraz dostępny jako pakiet NuGet obsługiwany przez firmę Microsoft.

Aby użyć ZipFile, musisz pobrać System.IO.Compression.ZipFile pakiet NuGet .

Michał Jarzyna
źródło
1

Dodaj System.IO.Compression.ZipFile jako odniesienie NuGet, które działa

prathesh p
źródło
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

Erik Rausch
źródło
0

Problem polega na tym, że właśnie dodano odwołanie do System.IO.Compression, brakuje odniesienia do System.IO.Compression.Filesystem.dll

I musisz to zrobić na .net 4.5 lub nowszym (ponieważ nie istnieje w starszych wersjach).

Właśnie opublikowałem skrypt na TechNet. Może ktoś uzna go za przydatny, wymaga .net 4.5 lub 4.7

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

Jose Ortega
źródło