Я не нашел класс «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
gerryLowry

Ответы:

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
Мохамед Камаль
17
@MohamedKamal действительно, вы этого не сделаете, если не используете .NET 4.5, поскольку до тех пор он не существовал; см. информацию «Информация о версии» - «Поддерживается в: 4.5»
Marc Gravell
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. Выберите компоненты, на которые вы хотите сослаться, и нажмите OK.

Из статьи MSDN Как: добавить или удалить ссылки с помощью диалогового окна добавления ссылки .

Уилл Эдигер
источник
1
Спасибо за информацию. Я уже использовал System.IO.Compression; но затем пришлось добавить ссылку на использование System.IO.Compression.FileSystem, как вы описали выше, чтобы ZipFile скомпилировался без исходной ошибки OP.
Хью Сигрейвс,
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)
Мукус
10

Просто перейдите в раздел «Ссылки» и добавьте «System.IO.Compression.FileSystem».

user6604144
источник
У меня есть бесконечное количество мест, где можно найти «Ссылки». Не могли бы вы подсказать, где это найти?
Дэниел Каплан
2

Решение, которое мне помогло: перейдите в Инструменты> Диспетчер пакетов NuGet> Управление пакетом NuGet для решения ...> Обзор> Найдите System.IO.Compression.ZipFile и установите его.

Hanssss
источник
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();
}
Бурго855
источник
1

System.IO.Compressionтеперь доступен как пакет nuget, поддерживаемый Microsoft.

Для использования ZipFileвам необходимо скачать System.IO.Compression.ZipFile пакет nuget .

Михал Яржина
источник
1

Добавьте System.IO.Compression.ZipFile в качестве ссылки nuget, он работает

prathesh p
источник
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

Хосе Ортега
источник