Saya tidak menemukan kelas "ZipFile" di namespace "System.IO.Compression"

112

Saya tidak dapat menggunakan kelas "Zipfile" di ruang nama "System.IO.Compression", kode saya adalah:

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

kesalahannya adalah:

Nama 'zipfile' tidak ada dalam konteks saat ini

Bagaimana saya bisa mengatasinya?

Mohamed Kamal
sumber
lihat Rick Strahl's .NET 4.5 adalah pengganti untuk .NET 4.0
gerryLowry

Jawaban:

213

Anda membutuhkan referensi tambahan untuk ini; cara paling mudah untuk melakukannya adalah melalui paket 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" />

Jika Anda bekerja pada .NET Framework tanpa NuGet, Anda perlu menambahkan referensi dll ke rakitan, "System.IO.Compression.FileSystem.dll" - dan pastikan Anda menggunakan setidaknya .NET 4.5 (karena tidak ada di kerangka sebelumnya).

Untuk info, Anda dapat menemukan rakitan dan versi .NET dari MSDN

Marc Gravell
sumber
2
Saya menggunakan .NET 4.0 ... dan saya tidak menemukan file dll ini
Mohamed Kamal
17
@MohamedKamal memang, Anda tidak akan melakukannya kecuali Anda menggunakan .NET 4.5, karena belum ada sampai saat itu; lihat info "Informasi Versi" - "Didukung di: 4.5"
Marc Gravell
1
@MarcGravell Saya mengalami kesalahan yang sama. Saya memeriksa Visual Studio -> bantuan -> Tentang Microsoft Visual Studio, itu terlihat dengan .NET versi 4.5.51650. Apa yang harus saya periksa selanjutnya?
foxwendy
4
Saya tidak punya FileSystemreferensi. Hanya System.IO.Compression. Terima kasih. Aneh bahwa itu membutuhkan file yang tidak ada di namespace kelas. Ini adalah penyimpangan yang aneh dari konvensi.
Chris Benard
3
@ChrisBen Saya menemukan masalah yang sama. Termasuk referensi ke System.IO.Compression tidak cukup, saya membutuhkan FileSystem juga. Memang menarik.
dckuehn
32

Bagi mereka yang merupakan programmer hijau di .NET, untuk menambahkan referensi DLL seperti yang dicatat oleh MarcGravell , Anda mengikuti langkah-langkah berikut:

Untuk menambahkan referensi dalam Visual C #

  1. Di Solution Explorer, klik kanan node proyek dan klik Add Reference.
  2. Dalam kotak dialog Tambahkan Referensi, pilih tab yang menunjukkan tipe komponen yang ingin Anda rujuk.
  3. Pilih komponen yang ingin Anda rujuk, lalu klik OK.

Dari Artikel MSDN, Cara: Menambah atau Menghapus Referensi Dengan Menggunakan Kotak Dialog Tambah Referensi .

Will Ediger
sumber
1
Terimakasih atas infonya. Saya sudah menggunakan System.IO.Compression; tetapi kemudian harus menambahkan referensi untuk menggunakan System.IO.Compression.FileSystem seperti yang Anda jelaskan di atas untuk mendapatkan ZipFile untuk dikompilasi tanpa kesalahan asli OP.
Hugh Seagraves
17

Anda dapat menggunakan paket eksternal jika Anda tidak dapat meningkatkan ke 4.5. Salah satunya adalah Ionic.Zip.dll dari DotNetZipLib.

using Ionic.Zip;

Anda dapat mengunduhnya di sini, gratis. http://dotnetzip.codeplex.com/

John Faulkner
sumber
3
atau pasang melalui NuGet
northben
2
Bagaimana ini relevan dengan pertanyaan?
eugenekgn
20
pertanyaannya adalah "bagaimana cara memperbaikinya?" dan ini adalah salah satu cara untuk memperbaikinya - karena versinya .net tidak mendukungnya.
John Faulkner
4
Sayangnya, terkadang upgrade bukanlah pilihan. Dapatkan suara positif.
sampathsris
1
Ini relevan jika Anda menulis ke 2000 PC yang telah menginstal XP dan program Anda tidak dapat melakukan instalasi apa pun (untuk menginstal .net 4.5 framework)
Mukus
10

Cukup buka Referensi dan tambahkan "System.IO.Compression.FileSystem".

pengguna6604144
sumber
Saya memiliki tempat tanpa batas untuk menemukan "Referensi". Dapatkah Anda memberikan lebih banyak petunjuk tentang di mana menemukan ini?
Daniel Kaplan
2

Solusi yang membantu saya: Buka Alat> NuGet Package Manager> Kelola Paket NuGet untuk Solusi ...> Jelajahi> Cari System.IO.Compression.ZipFile dan instal

Hanssss
sumber
1

Saya tahu ini adalah utas lama, tetapi saya tidak bisa menghindari memposting beberapa info berguna tentang ini. Saya melihat pertanyaan Zip sering muncul dan ini menjawab hampir semua pertanyaan umum.

Untuk mengatasi masalah kerangka kerja menggunakan 4.5 + ... Mereka adalah kelas ZipStorer yang dibuat oleh jaime-olivares: https://github.com/jaime-olivares/zipstorer , dia juga telah menambahkan contoh bagaimana menggunakan kelas ini sebagai baik dan juga menambahkan contoh bagaimana mencari nama file tertentu juga.

Dan untuk referensi tentang cara menggunakan ini dan melakukan iterasi untuk ekstensi file tertentu sebagai contoh, Anda dapat melakukan ini:

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

System.IO.Compressionsekarang tersedia sebagai paket nuget yang dikelola oleh Microsoft.

Untuk menggunakan ZipFileAnda perlu mengunduh System.IO.Compression.ZipFile paket nuget .

Michał Jarzyna
sumber
1

Tambahkan System.IO.Compression.ZipFile sebagai referensi nuget yang berfungsi

prathesh hal
sumber
0

Di explorer solusi, klik kanan Referensi, lalu klik untuk memperluas rakitan, temukan System.IO.Compression.FileSystem dan pastikan sudah dicentang. Kemudian Anda dapat menggunakannya di kelas Anda -using System.IO.Compression;

Tambahkan Screenshot Majelis Referensi

Erik Rausch
sumber
0

Masalahnya di sini adalah bahwa Anda baru saja menambahkan referensi ke System.IO.Compression, referensi ke System.IO.Compression.Filesystem.dll tidak ada

Dan Anda perlu melakukannya di .net 4.5 atau yang lebih baru (karena tidak ada di versi yang lebih lama).

Saya baru saja memposting skrip di TechNet Mungkin seseorang akan menganggapnya berguna karena membutuhkan .net 4.5 atau 4.7

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

Jose Ortega
sumber