Как я могу перечислить содержимое папки .zip в C#?

Как я могу перечислить содержимое заархивированной папки на C#? Например, как узнать, сколько элементов содержится в заархивированной папке и как их зовут?

В случае .NET 4.5 или новее вам больше не нужна сторонняя библиотека! Смотрите мой ответ ниже!

Csaba Toth 07.07.2015 18:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
1
47 160
8

Ответы 8

Отметьте SharpZipLib

ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));

while (inStream.GetNextEntry())
{

     ZipEntry entry = inStream.GetNextEntry();
     //write out your entry's filename
}

DotNetZip - Работа с Zip-файлами на языках .NET.

DotNetZip - это небольшая, простая в использовании библиотека классов для управления файлами .zip. Он может позволить приложениям .NET, написанным на VB.NET, C#, любом языке .NET, легко создавать, читать и обновлять zip-файлы.

пример кода для чтения почтового индекса:

using (var zip = ZipFile.Read(PathToZipFolder))
{
    int totalEntries = zip.Entries.Count; 
    foreach (ZipEntry e in zip.Entries)
    {
        e.FileName ...
        e.CompressedSize ...
        e.LastModified...
    }
}

Если вы используете .Net Framework 3.0 или новее, ознакомьтесь с файлом System.IO.Packaging пространство имен. Это избавит вас от зависимости от внешней библиотеки.

В частности, обратите внимание на ZipPackage Класс.

Он устраняет зависимость от внешней библиотеки, но удобство использования ZipPackage действительно не очень хорошее. Все - компромисс!

Cheeso 09.03.2009 01:46
ZipPackage предназначен для обработки в основном тех форматов файлов, связанных с Microsoft, которые внутри являются zip-файлами, например: docx, xlsx, XPS, nupkg .... С точки зрения обычного zip-файла они отличаются только из-за наличия файла Content_Type.xml, помещенного в корень архива. Если вы не можете использовать .NET 4.5, но можете использовать .NET 3.0, ZipPackage может быть идеальным, учитывая, что вы производите и потребляете файлы.
Csaba Toth 14.02.2014 03:22

Для .NET 4.5 или более поздней версии следует использовать класс ZipArchive для общих целей zip, см. Мой ответ ниже

Csaba Toth 09.07.2015 01:29

Я здесь относительно новичок, так что, возможно, я не понимаю, что происходит. :-) В настоящее время в этой теме есть 4 ответа, в которых два лучших ответа были отклонены. (Pearcewg's и cxfx's) Статья, на которую указывает pearcewg, важна, поскольку она разъясняет некоторые вопросы лицензирования SharpZipLib. Недавно мы оценили несколько библиотек сжатия .Net и обнаружили, что DotNetZip в настоящее время является лучшей альтернативой.

Очень краткое резюме:

  • System.IO.Packaging значительно медленнее, чем DotNetZip.

  • SharpZipLib - это GPL - см. Статью.

Итак, для начала, я проголосовал за эти два ответа.

Ким.

Сама GPL специально решает проблему частей программы, которые не являются «производными» от кода под GPL, и их права на независимое лицензирование. Я не понимаю, насколько серьезной проблемой является SharpZipLib, являющийся лицензией GPL.

GalacticCowboy 25.11.2008 00:26

GC, вы говорите, что если у группы или организации есть проблема с GPL, то группа ошибается? Или вы просто не можете понять, как у кого-то могут возникнуть проблемы с GPL? В это не так уж и сложно поверить. Пресса изобилует рассказами о дорогостоящих юридических проверках.

Cheeso 09.03.2009 01:45

Да, GPL вирусна. Если он создает коммерческое программное обеспечение с закрытым исходным кодом и связывает свой код с библиотекой под GPL, то он должен выпустить свой исходный код под лицензией, совместимой с GPL. Так что да, тот факт, что SharpZibLib является лицензией GPL, является серьезной проблемой.

cdmckay 02.06.2009 03:59

Этот пост: комментарий к другим ответам; обсуждение лицензирования (важно в любом контексте, но не только здесь и не имеет отношения к вопросу); запись о том, как вы проголосовали; и некоторые рекомендации библиотеки. Чем не является: ответ на вопрос «Как вывести список содержимого папки .zip в C#?».

Stephen Kennedy 05.04.2018 14:16

Лучше всего использовать .NET, встроенный в функциональность J # zip, как показано в MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx. По этой ссылке приведен полный рабочий пример приложения для чтения и записи в zip-файлы. Для конкретного примера перечисления содержимого zip-файла (в данном случае пакета приложения Silverlight .xap) код может выглядеть следующим образом:


ZipFile package = new ZipFile(packagePath);
java.util.Enumeration entries = package.entries();
//We have to use Java enumerators because we
//use java.util.zip for reading the .zip files
while ( entries.hasMoreElements() )
{
    ZipEntry entry = (ZipEntry) entries.nextElement();

    if (!entry.isDirectory())
    {
        string name = entry.getName();
        Console.WriteLine("File: " + name + ", size: " + entry.getSize() + ", compressed size: " + entry.getCompressedSize());
    }
    else
    {
        // Handle directories...
    }                        
}

У Айдсмана был правый указатель, но есть проблемы. В частности, вы можете столкнуться с проблемами при открытии zip-файлов, но это допустимое решение, если вы собираетесь создавать пакеты с помощью Только. ZipPackage реализует абстрактный класс Package и позволяет манипулировать zip-файлами. В MSDN есть пример того, как это сделать: http://msdn.microsoft.com/en-us/library/ms771414.aspx. Примерно код будет выглядеть так:

             string packageRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/document";
            string resourceRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/required-resource";
            // Open the Package.
            // ('using' statement insures that 'package' is
            //  closed and disposed when it goes out of scope.)
            foreach (string packagePath in downloadedFiles)
            {
                Logger.Warning("Analyzing " + packagePath);
                using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.Read))
                {
                    Logger.OutPut("package opened");
                    PackagePart documentPart = null;
                    PackagePart resourcePart = null;

                    // Get the Package Relationships and look for
                    //   the Document part based on the RelationshipType
                    Uri uriDocumentTarget = null;
                    foreach (PackageRelationship relationship in
                        package.GetRelationshipsByType(packageRelationshipType))
                    {
                        // Resolve the Relationship Target Uri
                        //   so the Document Part can be retrieved.
                        uriDocumentTarget = PackUriHelper.ResolvePartUri(
                            new Uri("/", UriKind.Relative), relationship.TargetUri);

                        // Open the Document Part, write the contents to a file.
                        documentPart = package.GetPart(uriDocumentTarget);
                        //ExtractPart(documentPart, targetDirectory);
                        string stringPart = documentPart.Uri.ToString().TrimStart('/');
                        Logger.OutPut("  Got: " + stringPart);
                    }

                    // Get the Document part's Relationships,
                    //   and look for required resources.
                    Uri uriResourceTarget = null;
                    foreach (PackageRelationship relationship in
                        documentPart.GetRelationshipsByType(
                                                resourceRelationshipType))
                    {
                        // Resolve the Relationship Target Uri
                        //   so the Resource Part can be retrieved.
                        uriResourceTarget = PackUriHelper.ResolvePartUri(
                            documentPart.Uri, relationship.TargetUri);

                        // Open the Resource Part and write the contents to a file.
                        resourcePart = package.GetPart(uriResourceTarget);

                        //ExtractPart(resourcePart, targetDirectory);
                        string stringPart = resourcePart.Uri.ToString().TrimStart('/');
                        Logger.OutPut("  Got: " + stringPart);
                    }

                }
            }

Лучше всего использовать J #, как показано в MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx

В этой статье есть указатели на другие библиотеки C# .zip с разными лицензиями, например SharpNetZip и DotNetZip: как читать файлы из несжатого zip в с #?. Они могут быть неподходящими из-за лицензионных требований.

нет, это не самое лучшее. Среда выполнения J # основана на старой библиотеке Java, в архиве есть ошибки, и он больше не поддерживается.

Cheeso 27.03.2009 08:15

Крик - этот код, использующий среду выполнения J #, ужасен! И я не согласен, что это лучший способ - J # сейчас не поддерживается. И это ОГРОМНАЯ среда выполнения, если все, что вам нужно, - это поддержка ZIP.

Как насчет этого - он использует DotNetZip (бесплатная, MS-Public лицензия)

using (ZipFile zip = ZipFile.Read(zipfile) )
{
    bool header = true;
    foreach (ZipEntry e in zip)
    {
        if (header)
        {
            System.Console.WriteLine("Zipfile: {0}", zip.Name);
            if ((zip.Comment != null) && (zip.Comment != ""))
                System.Console.WriteLine("Comment: {0}", zip.Comment);

            System.Console.WriteLine("\n{1,-22} {2,9}  {3,5}   {4,9}  {5,3} {6,8} {0}",
                                     "Filename", "Modified", "Size", "Ratio", "Packed", "pw?", "CRC");
            System.Console.WriteLine(new System.String('-', 80));
            header = false;
        }

        System.Console.WriteLine("{1,-22} {2,9} {3,5:F0}%   {4,9}  {5,3} {6:X8} {0}",
                                 e.FileName,
                                 e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                                 e.UncompressedSize,
                                 e.CompressionRatio,
                                 e.CompressedSize,
                                 (e.UsesEncryption) ? "Y" : "N",
                                 e.Crc32);

        if ((e.Comment != null) && (e.Comment != ""))
            System.Console.WriteLine("  Comment: {0}", e.Comment);
    }
}

Если вы похожи на меня и не хотите использовать внешний компонент, вот код, который я разработал вчера вечером с использованием класса .NET ZipPackage.

var zipFilePath = "c:\\myfile.zip";
var tempFolderPath = "c:\\unzipped";

using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
    foreach (PackagePart part in package.GetParts())
    {
        var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
        var targetDir = target.Remove(target.LastIndexOf('\\'));

        if (!Directory.Exists(targetDir))
            Directory.CreateDirectory(targetDir);

        using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
        {
            source.CopyTo(File.OpenWrite(target));
        }
    }
}

На заметку:

  • ZIP-архив ДОЛЖЕН иметь в корне файл [Content_Types] .xml. Это не было проблемой для моих требований, так как я буду контролировать архивирование любых ZIP-файлов, извлекаемых с помощью этого кода. Для получения дополнительной информации о файле [Content_Types] .xml, пожалуйста, обратитесь к: Новый стандарт упаковки ваших данных Ниже на Рисунке 13 этой статьи есть пример файла.

  • Этот код использует метод Stream.CopyTo в .NET 4.0.

Какой месяц и год для Журнал МДСН? msdn.microsoft.com/en-us/magazine/ee310108.aspx

Kiquenet 08.07.2015 11:23

.NET 4.5 или новее, наконец, имеет встроенную возможность обрабатывать общие zip-файлы с классом System.IO.Compression.ZipArchive (http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx) в сборке System.IO.Compression. Нет необходимости в сторонней библиотеке.

string zipPath = @"c:\example\start.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        Console.WriteLine(entry.FullName);
    }
} 

Прекрасно работает сразу после установки без сторонних компонентов. Обязательно добавьте ссылки System.IO.Compression.dll и System.IO.Compression.FileSystem.dll.

Matt 17.11.2015 15:22

Другие вопросы по теме