¿Cómo creo archivos 7-Zip con .NET?

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


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

  • “Destrozar” a 7z.exe: este es el enfoque más simple y efectivo, y puedo confirmar que funciona muy bien . Como menciona workmad3 , solo necesito garantizar que 7z.exe está instalado en todas las máquinas de destino, lo cual es algo que puedo garantizar.
  • 7Zip en compresión de memoria : esto se refiere a comprimir cookies “en memoria” antes de enviarlo al cliente; este método parece algo prometedor. Los métodos de envoltura (que envuelven el LZMA SDK ) devuelven el tipo byte[] . Cuando escribo el conjunto de byte[] en un archivo, no puedo extraerlo usando 7-Zip ( File.7z is not supported archive ).
  • 7zSharp Wrapper (encontrado en CodePlex) – esto envuelve el 7z exe / LZMA SDK . Hice referencia al proyecto desde mi aplicación, y se crearon exitosamente algunos archivos de almacenamiento, pero no pude extraer los archivos usando el progtwig regular 7-Zip ( File.7z is not supported archive ).
  • 7Zip SDK aka LZMA SDK – Supongo que no soy lo suficientemente inteligente como para descubrir cómo usar esto (por eso publiqué aquí) … Cualquier código de trabajo que muestre la creación de un archivo 7zip que pueda ser extraído por el progtwig regular 7zip?
  • Interfaz CodeProject C # (.NET) para archivos DLL 7-Zip Archive : solo admite la extracción de archivos 7zip … ¡Tengo que crearlos!
  • SharpZipLib : según sus preguntas frecuentes , SharpZipLib no es compatible con 7zip.

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

Ejemplo de EggCafe 7Zip cookie Este es un ejemplo (zip de cookie) con el DLL de 7Zip.

CodePlex Wrapper Este es un proyecto de código abierto que modifica 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 completo de trabajo usando el SDK de SevenZip en C #.

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

PD. El ejemplo anterior nunca iba a descomprimirse 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.

p.ej:

 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, me gusta 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 girar comandos 7zip para shell hay otros problemas, como 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, en el momento de la redacción desafortunadamente solo es compatible con la lectura de archivos 7-zip. PERO la escritura de archivos está en su lista de tareas (vea el archivo léame). Para lectores futuros: verifique para obtener el estado actual aquí: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md