ฉันไม่พบคลาส“ ZipFile” ในเนมสเปซ“ System.IO.Compression”


112

ฉันไม่สามารถใช้คลาส "Zipfile" ในพื้นที่ชื่อ "System.IO.Compression" รหัสของฉันคือ:

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

ข้อผิดพลาดคือ:

ไม่มีชื่อ 'zipfile' ในบริบทปัจจุบัน

ฉันจะแก้ปัญหาได้อย่างไร


คำตอบ:


213

คุณต้องการข้อมูลอ้างอิงเพิ่มเติมสำหรับสิ่งนี้ วิธีที่สะดวกที่สุดคือผ่านแพ็คเกจ 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" />

หากคุณกำลังทำงานกับ. NET Framework โดยไม่มี NuGet คุณต้องเพิ่มการอ้างอิง dll ในแอสเซมบลี "System.IO.Compression.FileSystem.dll" - และตรวจสอบให้แน่ใจว่าคุณใช้. NET 4.5 เป็นอย่างน้อย (เนื่องจากไม่ มีอยู่ในกรอบก่อนหน้านี้)

สำหรับข้อมูลคุณสามารถค้นหาเวอร์ชันแอสเซมบลีและ. NET ได้จาก MSDN


2
ฉันใช้. NET 4.0 ... และไม่พบไฟล์ dll นี้
Mohamed Kamal

17
@MohamedKamal แน่นอนคุณจะไม่ทำเว้นแต่คุณจะใช้. NET 4.5 เนื่องจากไม่มีอยู่จนถึงตอนนั้น ดูข้อมูล "ข้อมูลเวอร์ชัน" - "รองรับใน: 4.5"
Marc Gravell

1
@MarcGravell ฉันมีข้อผิดพลาดเดียวกัน ฉันตรวจสอบ Visual Studio -> help -> เกี่ยวกับ Microsoft Visual Studio มันแสดงด้วย. NET เวอร์ชัน 4.5.51650 ฉันควรตรวจสอบอะไรต่อไป?
foxwendy

4
ฉันไม่มีFileSystemข้อมูลอ้างอิง เท่านั้นSystem.IO.Compression. ขอบคุณ. แปลกที่ต้องใช้ไฟล์ที่ไม่ได้อยู่ในเนมสเปซของคลาส มันเป็นความเบี่ยงเบนแปลก ๆ จากการประชุมใหญ่
Chris Benard

3
@ChrisBenard ฉันพบปัญหาเดียวกัน รวมถึงการอ้างอิงถึง System.IO การบีบอัดไม่เพียงพอฉันต้องการ FileSystem ด้วย น่าสนใจแน่นอน
dckuehn

32

สำหรับผู้ที่เป็นโปรแกรมเมอร์สีเขียวใน. NET หากต้องการเพิ่มการอ้างอิง DLL ตามที่MarcGravellระบุไว้ให้ทำตามขั้นตอนต่อไปนี้:

เมื่อต้องการเพิ่มการอ้างอิงใน Visual C #

  1. ในโซลูชัน Explorer ให้คลิกขวาที่โหนดโครงการแล้วคลิกเพิ่มการอ้างอิง
  2. ในกล่องโต้ตอบเพิ่มการอ้างอิงเลือกแท็บที่ระบุประเภทของส่วนประกอบที่คุณต้องการอ้างอิง
  3. เลือกส่วนประกอบที่คุณต้องการอ้างอิงจากนั้นคลิกตกลง

จาก MSDN บทความวิธีการ: เพิ่มหรือลบการอ้างอิงโดยใช้การเพิ่มการอ้างอิงกล่องโต้ตอบ


1
ขอบคุณสำหรับข้อมูล. ฉันใช้ System.IO.Compression แล้ว แต่ต้องเพิ่มการอ้างอิงเพื่อใช้ System.IO.Compression.FileSystem ตามที่คุณอธิบายไว้ข้างต้นเพื่อให้ ZipFile รวบรวมโดยไม่มีข้อผิดพลาดดั้งเดิมของ OP
Hugh Seagraves

17

คุณสามารถใช้แพ็คเกจภายนอกได้หากคุณไม่สามารถอัพเกรดเป็น 4.5 หนึ่งในนั้นคือ Ionic.Zip.dll จาก DotNetZipLib

using Ionic.Zip;

คุณสามารถดาวน์โหลดได้ที่นี่ฟรี http://dotnetzip.codeplex.com/


3
หรือติดตั้งผ่าน NuGet
northben

2
สิ่งนี้เกี่ยวข้องกับคำถามอย่างไร
eugenekgn

20
คำถามของเขาคือ "ฉันจะแก้ไขได้อย่างไร" และนี่เป็นวิธีหนึ่งในการแก้ไขเนื่องจาก. net เวอร์ชันของเขาไม่รองรับ
John Faulkner

4
น่าเศร้าที่บางครั้งการอัปเกรดไม่ใช่ทางเลือก มีการโหวตเพิ่มขึ้น
sampathsris

1
สิ่งนี้มีความเกี่ยวข้องหากคุณเขียนไปยังพีซี 2,000 เครื่องที่ติดตั้ง XP และโปรแกรมของคุณไม่สามารถทำการติดตั้งใด ๆ (เพื่อติดตั้ง. net 4.5 framework)
Mukus

10

เพียงไปที่การอ้างอิงและเพิ่ม "System.IO.Compression.FileSystem"


ฉันมีสถานที่ที่ไม่ จำกัด ในการค้นหา "ข้อมูลอ้างอิง" คุณสามารถให้คำแนะนำเพิ่มเติมเกี่ยวกับสิ่งนี้ได้หรือไม่?
Daniel Kaplan

2

วิธีแก้ปัญหาที่ช่วยฉัน: ไปที่ Tools> NuGet Package Manager> Manage NuGet Packaged for Solution ... > Browse> Search for System.IO.Compression.ZipFile และติดตั้ง


1

ฉันรู้ว่านี่เป็นกระทู้เก่า แต่ฉันไม่สามารถหลีกเลี่ยงการโพสต์ข้อมูลที่เป็นประโยชน์เกี่ยวกับเรื่องนี้ได้ ฉันเห็นคำถาม Zip เกิดขึ้นมากมายและคำตอบนี้ใกล้เคียงกับคำถามที่พบบ่อยที่สุด

หากต้องการแก้ไขปัญหาเฟรมเวิร์กในการใช้ 4.5 + ... คลาส ZipStorer ที่สร้างโดย jaime-olivares: https://github.com/jaime-olivares/zipstorerเขาได้เพิ่มตัวอย่างวิธีการใช้คลาสนี้เป็น และยังได้เพิ่มตัวอย่างวิธีการค้นหาชื่อไฟล์เฉพาะอีกด้วย

และสำหรับการอ้างอิงเกี่ยวกับวิธีใช้สิ่งนี้และทำซ้ำสำหรับนามสกุลไฟล์บางไฟล์ดังตัวอย่างคุณสามารถทำได้:

#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

ในโซลูชัน explorer คลิกขวาที่การอ้างอิงจากนั้นคลิกเพื่อขยายแอสเซมบลีค้นหา System.IO.Compression.FileSystem และตรวจสอบให้แน่ใจว่าได้เลือกไว้ จากนั้นคุณสามารถใช้ในชั้นเรียนของคุณ -using System.IO.Compression;

เพิ่มภาพหน้าจอของแอสเซมบลีการอ้างอิง


0

ปัญหาคือคุณเพิ่งเพิ่มการอ้างอิงไปยัง System.IO.Compression ซึ่งไม่มีการอ้างอิงถึง System.IO.Compression.Filesystem.dll

และคุณต้องทำบน. net 4.5 หรือใหม่กว่า (เนื่องจากไม่มีในเวอร์ชันเก่า)

ฉันเพิ่งโพสต์สคริปต์บน TechNet บางทีใครบางคนอาจคิดว่ามันมีประโยชน์ก็ต้องใช้. net 4.5 หรือ 4.7

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.