Domanda

Come posso creare archivi 7-Zip dalla mia applicazione console C #? Devo essere in grado di estrarre gli archivi usando il programma 7-Zip regolare e ampiamente disponibile.


Ecco i miei risultati con gli esempi forniti come risposte a questa domanda

  • " Sottolineare " a 7z.exe: questo è l'approccio più semplice ed efficace e posso confermare che funziona bene . Come menzioni workmad3 , devo solo garantire che 7z.exe sia installato su tutti i computer di destinazione, cosa che posso garantire.
  • 7Zip in compressione della memoria - si riferisce alla compressione dei cookie " in-memory " prima di inviarlo al cliente; questo metodo sembra in qualche modo promettente. I metodi wrapper (che includono il LZMA SDK ) restituiscono il tipo byte[]. Quando scrivo l'array File.7z is not supported archive su un file, non riesco ad estrarlo utilizzando 7-Zip (<=>).
  • 7zSharp Wrapper (che si trova su CodePlex) - questo avvolge 7z exe / LZMA SDK . Ho fatto riferimento al progetto dalla mia app e ha creato correttamente alcuni file di archivio, ma non sono stato in grado di estrarre i file utilizzando il normale programma 7-Zip (<=>).
  • 7Zip SDK aka LZMA SDK - Immagino di non essere abbastanza intelligente da capire come utilizzare questo (motivo per cui ho pubblicato qui) ... Qualche esempio di codice funzionante che dimostra la creazione di un archivio 7zip che può essere estratto dal normale programma 7zip?
  • Interfaccia CodeProject C # (.NET) per DLL di archivi 7-Zip - supporta solo l'estrazione dagli archivi 7zip ... Devo crearli!
  • SharpZipLib - Secondo il loro FAQ , SharpZipLib non supporta 7zip.
È stato utile?

Soluzione

Se puoi garantire che l'app 7-zip sarà installata (e nel percorso) su tutte le macchine target, puoi scaricare scaricando l'app della riga di comando 7z. Non è la soluzione più elegante ma è il minimo lavoro.

Altri suggerimenti

EggCafe 7Zip esempio di cookie Questo è un esempio (cookie zippato) con la DLL di 7Zip.

Wrapper CodePlex Questo è un progetto open source che deforma la funzione zippatura di 7z.

7Zip SDK L'SDK ufficiale per 7zip (C, C ++, C #, Java) < --- Il mio suggerimento

Libreria zip .Net di SharpDevelop.net

CodeProject esempio con 7zip

SharpZipLib Molti zippare

SevenZipSharp è un'altra soluzione. Crea archivi a 7 zip ...

Ecco un esempio di lavoro completo che utilizza l'SDK SevenZip in C #.

Scriverà e leggerà i file 7zip standard creati dall'applicazione Windows 7zip.

PS. L'esempio precedente non si sarebbe mai decompresso perché non ha mai scritto le informazioni sulla proprietà richieste all'inizio del file.

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

Ho usato sdk.

es:

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

Installa 7 zip dall'origine e passa il parametro al metodo.

Grazie. Per favore, ti piace la risposta.

Uso questo codice

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

Questo modo più semplice è lavorare con i file .zip invece di .7z e usare Dot Net Zip

Durante lo spin off dei comandi di 7zip sulla shell ci sono altri problemi come i privilegi dell'utente, ho avuto problemi 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 è secondo me una delle librerie di compressione più intelligenti in circolazione. Supporta LZMA (7-zip), è facile da usare e in fase di sviluppo attivo.

Dato che ha già il supporto per lo streaming LZMA, al momento della scrittura purtroppo supporta solo la lettura di archivi a 7 zip. MA la scrittura dell'archivio è nella loro lista delle cose da fare (vedi il file Leggimi). Per i lettori futuri: Controlla per ottenere lo stato corrente qui: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Installa il pacchetto NuGet chiamato SevenZipSharp.Interop

Quindi:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top