it-swarm.com.ru

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

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


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

  • «Обстреливать» 7z.exe - это самый простой и эффективный подход, и я могу подтвердить, что он прекрасно работает. Как workmad3 упоминает , мне просто нужно гарантировать, что 7z.exe установлен на всех целевых машинах, что я могу гарантировать.
  • 7Zip в сжатии памяти - это относится к сжатию куки "в памяти" перед отправкой клиенту; этот метод кажется несколько перспективным. Методы обертки (обертывание 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 aka LZMA SDK - Думаю, я недостаточно умен, чтобы понять, как это использовать (вот почему я разместил здесь) ... Любые примеры работающего кода, демонстрирующие создание архива 7Zip, способного извлекаться обычной программой 7Zip?
  • Интерфейс CodeProject C # (.NET) для библиотек DLL 7-Zip - поддерживает извлечение только из архивов 7Zip ... Мне нужно их создать!
  • SharpZipLib - Согласно их FAQ , SharpZipLib не поддерживает 7Zip.
92
Seibar

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

28
workmad3

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

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

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

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

CodeProject пример с 7Zip

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

74
Patrick Desjardins

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

25
markhor

Вот полный рабочий пример использования 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");
        }
    }
}
22
Orwellophile

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

Благодарю. Пожалуйста, как ответ.

3
Vishal sen

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

При выделении команд 7Zip для Shell есть другие проблемы, такие как пользовательские привилегии, у меня была проблема с 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
1
Brent

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

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

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

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

0
Mario Eis

Установите пакет 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);
0
Fidel