Pregunta

¿Cómo puedo crear archivos 7-Zip desde mi aplicación de consola C #? Necesito poder extraer los archivos usando el programa 7-Zip regular y ampliamente disponible.


Aquí están mis resultados con los ejemplos proporcionados como respuestas a esta pregunta

  • " Descartando " a 7z.exe: este es el enfoque más simple y efectivo, y puedo confirmar que funciona bien . Como workmad3 menciona , solo necesito garantizo que 7z.exe esté instalado en todas las máquinas de destino, que es algo que puedo garantizar.
  • 7Zip in compresión de memoria : se refiere a la compresión de cookies " en memoria " antes de enviar al cliente; Este método parece algo prometedor. Los métodos de envoltura (envolviendo el LZMA SDK ) devuelven el tipo byte[]. Cuando escribo la matriz File.7z is not supported archive en un archivo, no puedo extraerla usando 7-Zip (<=>).
  • 7zSharp Wrapper (que se encuentra en CodePlex): esto envuelve el 7z exe / LZMA SDK . Hice referencia al proyecto desde mi aplicación, y creó con éxito algunos archivos, pero no pude extraer los archivos usando el programa regular 7-Zip (<=>).
  • 7Zip SDK también conocido como LZMA SDK - Supongo que no soy lo suficientemente inteligente como para pensar para saber cómo usar esto (por eso publiqué aquí) ... ¿Algún ejemplo de código de trabajo que demuestre la creación de un archivo 7zip que pueda extraer el programa 7zip normal?
  • Interfaz CodeProject C # (.NET) para archivos DLL de archivo 7-Zip - solo admite la extracción de archivos 7zip ... ¡Necesito crearlos!
  • SharpZipLib - Según su Preguntas frecuentes , SharpZipLib no es compatible con 7zip.
¿Fue útil?

Solución

Si puede garantizar que la aplicación 7-zip se instalará (y en la ruta) en todas las máquinas de destino, puede descargarla llamando a la aplicación de línea de comandos 7z. No es la solución más elegante, pero es el trabajo menos.

Otros consejos

EggCafe 7Zip ejemplo de cookie Este es un ejemplo (cookie de compresión) con la DLL de 7Zip.

CodePlex Wrapper Este es un proyecto de código abierto que deforma la función de compresión de 7z.

7Zip SDK El SDK oficial para 7zip (C, C ++, C #, Java) < --- Mi sugerencia

.NET zip library por SharpDevelop.net

Ejemplo de CodeProject con 7zip

SharpZipLib Muchos comprimidos

SevenZipSharp es otra solución. Crea archivos 7-zip ...

Aquí hay un ejemplo de trabajo completo usando SevenZip SDK en C #.

Escribirá y leerá los archivos 7zip estándar creados por la aplicación Windows 7zip.

PS. El ejemplo anterior nunca se descomprimirá porque nunca escribió la información de propiedad requerida al inicio del archivo.

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

Usé el SDK.

por ejemplo:

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) { }
        }

Simplemente instale 7 zip desde la fuente y pase el parámetro al método.

Gracias. Por favor, como la respuesta.

Yo uso este código

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

La forma más fácil es trabajar con archivos .zip en lugar de .7z y usar Dot Net Zip

Al desactivar los comandos 7zip para shell hay otros problemas como los privilegios de usuario, tuve un problema con 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 es, en mi opinión, una de las bibliotecas de compresión más inteligentes que existen. Es compatible con LZMA (7-zip), es fácil de usar y está en desarrollo activo.

Como ya tiene soporte de transmisión LZMA, desafortunadamente al momento de escribir esto solo admite la lectura de archivos de 7-zip. PERO la escritura de archivos está en su lista de tareas pendientes (ver archivo Léame). Para futuros lectores: Marque para obtener el estado actual aquí: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Instale el paquete NuGet llamado SevenZipSharp.Interop

Entonces:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top