рекомендовать библиотеку / API для распаковки файла на C #

Похоже, что в C # нет встроенной библиотеки / API для распаковки zip-файла. Я ищу бесплатную (лучше с открытым исходным кодом) библиотеку / API, которая могла бы работать с .Net 3.5 + VSTS 2008 + C #, чтобы распаковать zip-файл и извлечь все файлы в определенную папку.

Любая рекомендуемая библиотека / API или образцы?


person George2    schedule 21.06.2009    source источник


Ответы (10)


GPL

http://www.icsharpcode.net/OpenSource/SharpZipLib/

ИЛИ менее ограничительный Ms-PL

http://www.codeplex.com/DotNetZip

Чтобы ответить на этот вопрос, в .NET Framework есть ZipPackage Мне это не удалось.

person Sam Saffron    schedule 21.06.2009
comment
также .Net имеет встроенную реализацию, но с ней невозможно работать - person Sam Saffron; 21.06.2009
comment
Круто, мне нравится первый. Какой класс вы имеете в виду для .Net? - person George2; 21.06.2009
comment
Почему вы имеете в виду, что .Net ZipPackage менее успешен? - person George2; 21.06.2009
comment
См .: stackoverflow.com/questions/507751/ - person Sam Saffron; 22.06.2009
comment
В большинстве случаев DotNetZip значительно проще в использовании, чем SharpZipLib. - person Cheeso; 23.06.2009
comment
@Cheeso: Верно, но SharpZipLib поддерживает больше форматов файлов, например tar. - person Stefan Steiger; 02.02.2011
comment
Верно, но если вам нужна библиотека tar, используйте библиотеку tar. Формат намного проще, чем zip. Для .NET существует однофайловая библиотека tar: stackoverflow.com/questions/391936/ - person Cheeso; 02.02.2011
comment
В fx 4.5 добавлен System.IO.Compression.ZipArchive. Теперь у нас есть это встроенное. - person Frédéric; 15.05.2015

Если все, что вам нужно сделать, это разархивировать содержимое файла в папку, и вы знаете, что будете работать только в Windows, вы можете использовать объект Windows Shell. В этом примере я использовал dynamic из Framework 4.0, но вы можете добиться тех же результатов, используя Type.InvokeMember.

dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);

destinationFolder.CopyHere(compressedFolderContents);

Вы можете использовать FILEOP_FLAGS для управления поведением метода CopyHere.

person Simon MᶜKenzie    schedule 20.03.2012
comment
Безусловно, САМЫЙ отвратительный ответ на этот извечный вопрос! Это требует серьезного голосования. - person Joshua; 20.04.2012
comment
Я должен согласиться с @joshuam ... - person dda; 10.05.2013

DotNetZip прост в использовании. Вот образец распаковки

using (var zip = Ionic.Zip.ZipFile.Read("archive.zip"))
{
   zip.ExtractAll("unpack-directory");
}

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

DotNetZip является бесплатным и открытым исходным кодом.

person Cheeso    schedule 03.07.2009

Раньше я использовал DotNetZip (MS-PL), SharpZipLib (GPL) и 7ZIP SDK для C # (общественное достояние). Все они отлично работают и имеют открытый исходный код.

В этой ситуации я бы выбрал DotNetZip, и вот пример кода со страницы Примеры C # < / а>:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(TargetDirectory);
  }
}
person Maxim Zaslavsky    schedule 03.07.2009
comment
LGPL, а не GPL - разница довольно большая. - person Stefan Steiger; 01.02.2011
comment
@Quandary какой? Согласно их веб-сайту, SharpZipLib является лицензией GPL. - person Maxim Zaslavsky; 02.02.2011
comment
GPL с этим исключением (связывание его статически или динамически с вашим проектом не является производной работой по GPL) = LGPL (хорошо, разрешение на статическое связывание отсутствует в LGPL, поэтому они пишут это так, но статическое связывание необычно для .СЕТЬ). Откровенно говоря, это более либеральная версия LGPL. - person Stefan Steiger; 02.02.2011
comment
Нет, LGPL поставляется с дополнительными правилами по сравнению с исключением GPL +, например, вам необходимо предоставить объектные файлы, чтобы пользователь мог повторно связать приложение с настроенным вариантом библиотеки LGPL. - person MarkusSchaber; 23.07.2012

SharpZipLib

http://www.icsharpcode.net/OpenSource/SharpZipLib/

person Henri    schedule 21.06.2009
comment
Как вы относитесь к классу ZipPackage, созданному .Net? - person George2; 21.06.2009

Загляните в мою небольшую библиотеку: https://github.com/jaime-olivares/zipstorer

person Community    schedule 27.08.2009
comment
На самом деле это лучший ответ! - person Roopesh Shenoy; 22.02.2013

Если вы хотите использовать сжатие 7-zip, посмотрите статья EggheadCafe. Осторожно: в исходном коде LZMA для c # нет комментариев xml (на самом деле, очень мало комментариев вообще).

person C-Pound Guru    schedule 21.06.2009

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

private static void Unzip()
{
    var zipFilePath = "c:\\myfile.zip";
    var tempFolderPath = "c:\\unzipped";

    using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
    {
        foreach (PackagePart part in pkg.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))
            {
                CopyStream(source, File.OpenWrite(target));
            }
        }
    }
}

private static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[4096];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, read);
    }
} 

На заметку:

  • ZIP-архив ДОЛЖЕН иметь в корне файл [Content_Types] .xml. Это не было проблемой для моих требований, так как я буду контролировать архивирование любых ZIP-файлов, извлекаемых с помощью этого кода. Дополнительную информацию о файле [Content_Types] .xml см. На странице http://msdn.microsoft.com/en-us/magazine/cc163372.aspx Ниже рисунка 13 статьи находится файл с примером.

  • Я не тестировал метод CopyStream, чтобы убедиться, что он работает правильно, поскольку изначально я разработал его для .NET 4.0 с помощью метода Stream.CopyTo ().

person Joshua    schedule 09.04.2012

Я бы порекомендовал наш http://www.rebex.net/zip.net/, но Я предвзят. Загрузите пробную версию и проверьте возможности и образцы самостоятельно.

person Martin Vobr    schedule 07.09.2010

SevenZipSharp - это бесплатная оболочка для 7z.dll и LZMA SDK с открытым исходным кодом.

SevenZipCompressor compressor = new SevenZipCompressor(); 
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);
person d.popov    schedule 13.08.2013