Я не знайшов клас "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" не існує в поточному контексті

Як я можу це вирішити?


дивіться .NET 4.5
— Страля

Відповіді:


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"
— Марк Гравелл

1
@MarcGravell У мене така ж помилка. Я перевірив Visual Studio -> довідка -> Про Microsoft Visual Studio, він показує версію .NET 4.5.51650. Що слід перевірити далі?
— foxwendy

4
Я не мав FileSystemпосилання. Тільки System.IO.Compression. Дякую. Як не дивно, що для цього потрібен файл, який не знаходиться в просторі імен класу. Це дивне відхилення від умовності.
— Кріс Бенар

3
@ChrisBenard Я знайшов ту саму проблему. Включаючи посилання на System.IO.Compression було недостатньо, мені також потрібна була FileSystem. Дійсно цікаво.
— dckuehn

32

Для тих, хто зелений програміст у .NET, щоб додати посилання DLL, як зазначив MarcGravell , виконайте наступні дії:

Щоб додати посилання у Visual C #

  1. У Провіднику рішень клацніть правою кнопкою миші вузол проекту та натисніть Додати довідку.
  2. У діалоговому вікні Додати довідку виберіть вкладку із зазначенням типу компонента, на який потрібно посилатися.
  3. Виберіть компоненти, на які потрібно посилатися, і натисніть кнопку ОК.

З статті MSDN, як: Додавання та видалення посилань за допомогою діалогового вікна "Додати посилання" .


1
Дякуємо за інформацію. Я вже використовував System.IO.Compression; але потім довелося додати посилання на використання System.IO.Compression.FileSystem, як ви описали вище, щоб отримати компіляцію ZipFile без початкової помилки OP.
— Х'ю Seagraves

17

ви можете використовувати зовнішній пакет, якщо не можете оновити до 4,5. Один з таких - Ionic.Zip.dll від DotNetZipLib.

using Ionic.Zip;

Ви можете завантажити його тут, безкоштовно. http://dotnetzip.codeplex.com/


3
або встановити його через NuGet
— northben

2
Наскільки це стосується питання?
— eugenekgn

20
його питання було "як я це виправити?" і це є одним із способів виправити це - оскільки його версія .net не підтримувала його.
— Джон Фолкнер

4
На жаль, іноді оновлення не є вибором. Майте нагороду.
— sampathsris

1
Це актуально, якщо ви пишете на 2000 комп'ютерах, на яких встановлений XP, і програма не може здійснити жодну установку (для встановлення .net 4.5 Framework)
— Mukus,

10

Просто перейдіть до посилання та додайте "System.IO.Compression.FileSystem".


У мене є безмежні місця, де можна знайти "Список літератури". Чи можете ви дати більше підказок, де це знайти?
— Даніель Каплан

2

Вирішення, яке допомогло мені: Перейдіть до Інструменти> Менеджер пакунків NuGet> Керування пакетом NuGet для вирішення ...> Огляд> Шукати 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();
}


1

Додайте System.IO.Compression.ZipFile як основну посилання, на яку він працює


0

У провіднику рішень клацніть правою кнопкою миші Список літератури, потім клацніть, щоб розгорнути збірки, знайдіть 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.