Как создать архивы 7-Zip с помощью .NET?

Как я могу создавать архивы 7-Zip из моего консольного приложения C#? Мне нужно иметь возможность извлекать архивы с помощью обычной широко доступной программы 7-молния.


Вот мои результаты с примерами, предоставленными в качестве ответов на этот вопрос.

  • «Обстрел» до 7z.exe - это самый простой и эффективный подход, и я могу подтвердить, что это прекрасно работает. Как workmad3 упоминаний, мне просто нужно гарантировать, что 7z.exe установлен на всех целевых машинах, что я могу гарантировать.
  • 7Zip в сжатии памяти - это относится к сжатию файлов cookie "в памяти" перед отправкой клиенту; этот метод кажется несколько многообещающим. Методы-оболочки (обертывающие LZMA SDK) возвращают тип byte[]. Когда я записываю массив byte[] в файл, я не могу извлечь его с помощью 7-Zip (File.7z is not supported archive).
  • 7zSharp Wrapper (находится на CodePlex) - это оболочка для 7z exe / LZMA SDK. Я сослался на проект из своего приложения, и он успешно создал несколько архивных файлов, но мне не удалось извлечь файлы с помощью обычной программы 7-Zip (File.7z is not supported archive).
  • 7Zip SDK, он же LZMA SDK - Думаю, я недостаточно умен, чтобы понять, как это использовать (вот почему я разместил здесь) ... Любые примеры рабочего кода, демонстрирующие создание архива 7zip, который может быть извлечен обычной программой 7zip?
  • CodeProject C# (.NET) Интерфейс для библиотек DLL 7-Zip Archive - поддерживает извлечение только из архивов 7zip ... Мне нужно их создать!
  • SharpZipLib - Согласно их Часто задаваемые вопросы, SharpZipLib не поддерживает 7zip.

Не пишите это из гугла, когда все ссылки из моего поста ниже. Не очень уважительные к людям, которые нашли время, чтобы найти вам какие-то решения.

Patrick Desjardins 22.10.2008 18:18

Я знаю, что этот пост старый, но сегодня в моем исследовании я видел проект под названием SevenZipSharp. sevenzipsharp.codeplex.com

Timmerz 03.05.2012 01:27

Просто предупреждение для будущих читателей. SevenZipSharp кажется заброшенным программным обеспечением. На сегодняшний день последний стабильный выпуск (0.64) был выпущен еще в августе 2010 года с некоторыми неприятными проблемами многопоточности (согласно отчетам об ошибках). С тех пор было опубликовано только несколько исходный код фиксирует.

Anttu 22.01.2015 13:45
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
103
3
111 881
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Пример файла cookie EggCafe 7Zip Это пример (архивирование cookie) с DLL 7Zip.

CodePlex Wrapper Это проект с открытым исходным кодом, который искажает функцию архивирования 7z.

7Zip SDK Официальный SDK для 7zip (C, C++, C#, Java) <--- Мое предложение

.Net zip-библиотека от SharpDevelop.net

Пример CodeProject с 7zip

SharpZipLib Много архивов

Готово, и я добавил полезный проект с открытым исходным кодом.

Patrick Desjardins 21.10.2008 18:17

Я просмотрел код, полученный по первой ссылке - мне не нужно сжимать cookie, я хочу создать файл 7-Zip.

Seibar 21.10.2008 18:19

РЖУ НЕ МОГУ? Измените cookie на строку ... файл или что-то еще ... lol?

Patrick Desjardins 21.10.2008 18:22

Лучшее решение, которое я опубликовал, - это 7zip SDK здесь. Берем dll и zip. Работа сделана :)

Patrick Desjardins 21.10.2008 18:23

Нет-нет, если вы хотите создать 7-zip-файл, вы должны сжать cookie!

Ed Guiness 21.10.2008 18:23

хахаха да 7zip только для печенья хаха Terrapin ты делаешь мой день: D

Mister Dev 21.10.2008 18:23

просто помните, что прессованное печенье нужно разжать перед едой ... иначе у вас не получится шоколадной стружки ... Думаю, на этом я на сегодня схожу с ума: P

workmad3 21.10.2008 19:29

Вы действительно использовали какие-либо ссылки, которые вы разместили? Первая ссылка относится к сжатию файла cookie в памяти перед отправкой клиенту. Вторая ссылка (7zSharp) - это оболочка SDK. Мне не удалось создать архив, который я мог бы расшифровать. SharpZipLib не поддерживает 7zip. Код

Seibar 22.10.2008 01:11

Пример CodeProject поддерживает только декодирование - «В настоящее время мой проект имеет только возможности извлечения». Ищу полезный ответ на свой вопрос. Я также смог ввести несколько ключевых слов в Google, чтобы получить те же результаты. Если бы они были полезны, я бы здесь не спрашивал.

Seibar 22.10.2008 01:12

Нет, я просто хочу посмотреть, придумал ли кто-нибудь рабочий пример ... Спасибо за ваше исследование, но ни одна из предоставленных вами ссылок не смогла привести меня к чему-то, что работает.

Seibar 22.10.2008 17:06

Я должен согласиться с тем, что ни у кого нет кода, который можно было бы скопировать и вставить. SDK - это тот самый ответ, но для того, чтобы что-то работало, нужно время и усилия. Я понимаю, что ты не хочешь этого делать. Хорошего дня.

Patrick Desjardins 22.10.2008 17:16

В любом случае, я предлагаю удалить ссылки SharpDevelop / SharpZipLib, поскольку оба относятся к одному и тому же и не поддерживают 7-Zip. Сейбар явно просил 7z. Я также ищу решения 7z, потому что ShaprZipLib не работал с архивом и нашел эту ветку. ShaprZipLib - обманчивая подсказка!

Onsokumaru 03.08.2018 12:20
Ответ принят как подходящий

Если вы можете гарантировать, что приложение 7-zip будет установлено (и находится в пути) на всех целевых машинах, вы можете разгрузить его, вызвав приложение командной строки 7z. Не самое изящное решение, но и минимум работы.

На самом деле мы поставляем утилиту командной строки 7z с нашими двоичными файлами и оболочкой для нее. У нас действительно хорошо работает.

David Mohundro 22.10.2008 17:16

Я использовал sdk.

например:

using SevenZip.Compression.LZMA;
private static void CompressFileLZMA(string inFile, string outFile)
{
   SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

   using (FileStream input = new FileStream(inFile, FileMode.Open))
   {
      using (FileStream output = new FileStream(outFile, FileMode.Create))
      {
          coder.Code(input, output, -1, -1, null);
          output.Flush();
      }
   }
}

А как распаковать файл будешь? Я попытался сделать то же самое, используя SevenZip.Compression.LZMA.Decoder и вызвав его с помощью Code (stream1, stream2, -1, -1, null); Это дало исключение данных из фреймворка.

Karsten 26.05.2009 13:19

SevenZipSharp - другое решение. Создает 7-zip архивы ...

Этот пост Мархора на самом деле от создателя проекта SevenZipSharp. SevenZipSharp обеспечивает программный доступ к dll 7Zip, что делает ее очень полнофункциональной. Я обнаружил, что LZMA SDK низкоуровневый и трудный для понимания. SevenZipSharp, напротив, хорошо документирован, прост в использовании и имеет множество примеров использования в своем тестовом проекте. Используя примеры, я мог быстро сжимать и распаковывать файлы или память.

John Wigger 27.12.2010 23:43

SevenZipSharp кажется заброшенным. См. Мой предыдущий комментарий в вопросе.

Anttu 22.01.2015 13:49

SevenZipSharp работает медленно. На данный момент наиболее рекомендуемым решением является использование Process.Start («7z.exe ......)

klm_ 01.10.2017 10:34

Вот полный рабочий пример с использованием SevenZip SDK на C#.

Он будет записывать и читать стандартные файлы 7zip, созданные приложением Windows 7zip.

PS. Предыдущий пример никогда не собирался распаковывать, потому что он никогда не записывал требуемую информацию о свойствах в начало файла.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SevenZip.Compression.LZMA;
using System.IO;
using SevenZip;

namespace VHD_Director
{
    class My7Zip
    {
        public static void CompressFileLZMA(string inFile, string outFile)
        {
            Int32 dictionary = 1 << 23;
            Int32 posStateBits = 2;
            Int32 litContextBits = 3; // for normal files
            // UInt32 litContextBits = 0; // for 32-bit data
            Int32 litPosBits = 0;
            // UInt32 litPosBits = 2; // for 32-bit data
            Int32 algorithm = 2;
            Int32 numFastBytes = 128;

            string mf = "bt4";
            bool eos = true;
            bool stdInMode = false;


            CoderPropID[] propIDs =  {
                CoderPropID.DictionarySize,
                CoderPropID.PosStateBits,
                CoderPropID.LitContextBits,
                CoderPropID.LitPosBits,
                CoderPropID.Algorithm,
                CoderPropID.NumFastBytes,
                CoderPropID.MatchFinder,
                CoderPropID.EndMarker
            };

            object[] properties = {
                (Int32)(dictionary),
                (Int32)(posStateBits),
                (Int32)(litContextBits),
                (Int32)(litPosBits),
                (Int32)(algorithm),
                (Int32)(numFastBytes),
                mf,
                eos
            };

            using (FileStream inStream = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream outStream = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
                    encoder.SetCoderProperties(propIDs, properties);
                    encoder.WriteCoderProperties(outStream);
                    Int64 fileSize;
                    if (eos || stdInMode)
                        fileSize = -1;
                    else
                        fileSize = inStream.Length;
                    for (int i = 0; i < 8; i++)
                        outStream.WriteByte((Byte)(fileSize >> (8 * i)));
                    encoder.Code(inStream, outStream, -1, -1, null);
                }
            }

        }

        public static void DecompressFileLZMA(string inFile, string outFile)
        {
            using (FileStream input = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream output = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();

                    byte[] properties = new byte[5];
                    if (input.Read(properties, 0, 5) != 5)
                        throw (new Exception("input .lzma is too short"));
                    decoder.SetDecoderProperties(properties);

                    long outSize = 0;
                    for (int i = 0; i < 8; i++)
                    {
                        int v = input.ReadByte();
                        if (v < 0)
                            throw (new Exception("Can't Read 1"));
                        outSize |= ((long)(byte)v) << (8 * i);
                    }
                    long compressedSize = input.Length - input.Position;

                    decoder.Code(input, output, compressedSize, outSize, null);
                }
            }
        }

        public static void Test()
        {
            CompressFileLZMA("DiscUtils.pdb", "DiscUtils.pdb.7z");
            DecompressFileLZMA("DiscUtils.pdb.7z", "DiscUtils.pdb2");
        }
    }
}

Обратите внимание, что это чистое сжатие / декомпрессия LZMA. Формат файла 7zip - это слой выше этого, который позволяет упаковывать несколько файлов вместе с именами файлов / путями и другими метданными файлов.

redcalx 05.02.2015 13:25

@redcalx правильный. Кто-нибудь знает, как обработать верхний, 7zip слой? Ссылка на другой пост SO была бы замечательной :)

Christopher J Smith 07.06.2019 20:45

Я использую этот код

                string PZipPath = @"C:\Program Files\7-Zip\7z.exe";
                string sourceCompressDir = @"C:\Test";
                string targetCompressName = @"C:\Test\abc.zip";
                string CompressName = targetCompressName.Split('\\').Last();
                string[] fileCompressList = Directory.GetFiles(sourceCompressDir, "*.*");

                    if (fileCompressList.Length == 0)
                    {
                        MessageBox.Show("No file in directory", "Important Message");
                        return;
                    }
                    string filetozip = null;
                    foreach (string filename in fileCompressList)
                    {
                        filetozip = filetozip + "\"" + filename + " ";
                    }

                    ProcessStartInfo pCompress = new ProcessStartInfo();
                    pCompress.FileName = PZipPath;
                    if (chkRequestPWD.Checked == true)
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" " + filetozip + " -mx=9" + " -p" + tbPassword.Text;
                    }
                    else
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" \"" + filetozip + "\" -mx=9";
                    }
                    pCompress.WindowStyle = ProcessWindowStyle.Hidden;
                    Process x = Process.Start(pCompress);
                    x.WaitForExit();
 string zipfile = @"E:\Folderx\NPPES.zip";
 string folder = @"E:\TargetFolderx";

 ExtractFile(zipfile,folder);
public void ExtractFile(string source, string destination)
        {
            // If the directory doesn't exist, create it.
            if (!Directory.Exists(destination))
                Directory.CreateDirectory(destination);

            //string zPath = ConfigurationManager.AppSettings["FileExtactorEXE"];
          //  string zPath = Properties.Settings.Default.FileExtactorEXE; ;

            string zPath=@"C:\Program Files\7-Zip\7zG.exe";

            try
            {
                ProcessStartInfo pro = new ProcessStartInfo();
                pro.WindowStyle = ProcessWindowStyle.Hidden;
                pro.FileName = zPath;
                pro.Arguments = "x \"" + source + "\" -o" + destination;
                Process x = Process.Start(pro);
                x.WaitForExit();
            }
            catch (System.Exception Ex) { }
        }

Просто установите 7 zip из источника и передайте параметр методу.

Спасибо. Пожалуйста, понравился ответ.

Это сработало для меня в службе Windows с 7za.exe

Marco Duindam 23.04.2020 20:47

Самый простой способ - работать с файлами .zip вместо .7z и использовать Dot Net Zip.

При отключении команд 7zip для оболочки возникают другие проблемы, такие как права пользователя, у меня возникла проблема с SevenZipSharp.

Private Function CompressFile(filename As String) As Boolean
Using zip As New ZipFile()
    zip.AddFile(filename & ".txt", "")
    zip.Save(filename & ".zip")
End Using

Return File.Exists(filename & ".zip")
End Function

На мой взгляд, SharpCompress - одна из самых умных библиотек сжатия. Он поддерживает LZMA (7-zip), прост в использовании и находится в стадии активной разработки.

Поскольку он уже имеет поддержку потоковой передачи LZMA, на момент написания он, к сожалению, поддерживает только чтение 7-zip архивов. НО запись архива находится в их списке задач (см. Readme). Для будущих читателей: отметьте здесь, чтобы узнать текущий статус: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md

Установите пакет NuGet под названием SevenZipSharp.Interop

Затем:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);

Я попытался добавить с его помощью файл в существующий 7z-архив и получил испорченный архив.

Geograph 20.04.2019 12:40

Некоторая дополнительная тестовая информация о коде @Orwellophile с использованием текстового файла размером 17,9 МБ. Использование значений свойств в примере кода «как есть» окажет ОГРОМНОЕ отрицательное влияние на производительность, для этого потребуется 14.16 с..

Установка следующих свойств делает то же самое в 3.91 с (например, архив будет иметь ту же информацию о контейнере, которая: вы можете извлечь и протестировать архив с помощью 7zip, но нет информации о имени файла)

Родной 7zip 2 сек.

CoderPropID[] propIDs =  {
  //CoderPropID.DictionarySize,
  //CoderPropID.PosStateBits,
  //CoderPropID.LitContextBits,
  //CoderPropID.LitPosBits,
  //CoderPropID.Algorithm,
  //CoderPropID.NumFastBytes,
  //CoderPropID.MatchFinder,
  CoderPropID.EndMarker
};
object[] properties = {
  //(Int32)(dictionary),
  //(Int32)(posStateBits),
  //(Int32)(litContextBits),
  //(Int32)(litPosBits),
  //(Int32)(algorithm),
  //(Int32)(numFastBytes),
  //mf,
  eos
};

Я провел еще один тест, используя собственный 7zip и файл резервной копии SQL объемом 1,2 ГБ (.bak)
. 7zip (максимальное сжатие): 1 минута
LZMA SDK (@Orwellophile с указанным выше параметром свойства): 12:26 мин :-(
Выходной файл примерно такого же размера.

Думаю, я сам воспользуюсь решением, основанным на движке c / C++, т.е. либо вызовите исполняемый файл 7zip из C#, либо используйте коробка кальмара / SevenZipSharp, который является оболочкой для файла dll 7zip c / C++ и, по-видимому, является новейшим форком SevenZipSharp. Обертку не тестировал, но надеюсь, что она работает так же, как родной 7zip. Но, надеюсь, это даст возможность сжимать поток, чего вы, очевидно, не сможете, если вызовете exe напрямую. В противном случае, я думаю, нет большого преимущества перед вызовом exe. В оболочке есть дополнительные зависимости, поэтому опубликованный проект не станет «чище».

Кстати, похоже, что команда .Net Core рассматривает возможность реализации LZMA в классе system.io в .Core ver. 5, это было бы здорово!

(Я знаю, что это своего рода комментарий, а не ответ, но чтобы иметь возможность предоставить фрагмент кода, это не может быть комментарий)

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