Вопрос

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


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

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

Решение

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

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

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

CodePlex-оболочкаЭто проект с открытым исходным кодом, который использует функцию архивирования 7z.

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

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

КодПроект пример с 7zip

SharpZipLib Многие молнии

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

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

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

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

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");
        }
    }
}

Я использовал 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();
      }
   }
}
 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 из исходного кода и передайте параметр методу.

Спасибо.Пожалуйста, поставьте лайк ответу.

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

                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();

Самый простой способ — работать с файлами .zip вместо .7z и использовать Точечная сетка-молния

При отключении команд 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top