Я не нашел класс «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
— Мохамед Камаль

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».


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

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 в качестве ссылки nuget, он работает


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.