Я не знайшов клас "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.