Question

Comment créer des archives 7-Zip à partir de mon application console C #? Je dois pouvoir extraire les archives en utilisant le programme régulier et largement disponible 7-Zip .

Voici mes résultats avec les exemples fournis pour répondre à cette question

  • & "; bombarder &"; to 7z.exe: c’est l’approche la plus simple et la plus efficace, et je peux confirmer que cela fonctionne bien . Comme mention de workmad3 , il me suffit de garantir que 7z.exe est installé sur toutes les machines cibles, ce que je peux garantir.
  • 7Zip dans compression de la mémoire - il s’agit de la compression des cookies " en mémoire " avant d'envoyer au client; cette méthode semble quelque peu prometteuse. Les méthodes d'encapsulation (enveloppant le SDK LZMA ) renvoient le type byte[]. Lorsque j'écris le tableau File.7z is not supported archive dans un fichier, je ne peux pas l'extraire à l'aide de 7-Zip (<=>).
  • 7zSharp Wrapper (trouvé sur CodePlex) - ceci enveloppe le 7z exe / LZMA SDK . J'ai référencé le projet à partir de mon application et il a réussi à créer des fichiers archive, mais je n'ai pas pu extraire les fichiers à l'aide du programme standard 7-Zip (<=>).
  • SDK 7Zip aussi appelé SDK LZMA - Je suppose que je ne suis pas assez intelligent pour comprendre comment l’utiliser (c’est pourquoi j’ai posté ici) ... Des exemples de code de travail illustrant la création d’une archive 7zip pouvant être extraite par le programme standard 7zip?
  • Interface CodeProject C # (.NET) pour les DLL d'archivage 7 zips - ne supporte que l'extraction des archives 7zip ... Je dois les créer!
  • SharpZipLib - Selon leur FAQ , SharpZipLib ne prend pas en charge 7zip.
Était-ce utile?

La solution

Si vous pouvez garantir que l'application 7-zip sera installée (et dans le chemin) sur toutes les machines cibles, vous pouvez effectuer un déchargement en appelant l'application de ligne de commande 7z. Pas la solution la plus élégante mais c'est le moins de travail.

Autres conseils

EggCafe 7Zip exemple de cookie Ceci est un exemple (cookie zippé) avec la DLL de 7Zip.

CodePlex Wrapper Ceci est un projet open source qui déforme la fonction de compression de 7z.

SDK 7Zip Le SDK officiel de 7zip (C, C ++, C #, Java) < --- ma suggestion

Bibliothèque zip .Net de SharpDevelop.net

exemple CodeProject avec 7zip

SharpZipLib Nombreuses compressions

SevenZipSharp est une autre solution. Crée des archives 7-zip ...

Voici un exemple de travail complet utilisant le SDK SevenZip en C #.

Il va écrire et lire les fichiers 7zip standard créés par l’application Windows 7zip.

PS. L’exemple précédent n’allait jamais être décompressé car il n’écrivait jamais les informations de propriété requises au début du fichier.

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

J'ai utilisé le sdk.

par exemple:

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

Il suffit d'installer 7 zip à partir du source et de transmettre le paramètre à la méthode.

Merci. S'il vous plaît, aimez la réponse.

J'utilise ce code

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

Cette méthode la plus simple consiste à utiliser des fichiers .zip au lieu de .7z et à utiliser Dot Net Zip

Lors du transfert des commandes 7zip au shell, d'autres problèmes tels que les privilèges utilisateur, j'avais un problème avec 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 est à mon avis l'une des bibliothèques de compression les plus intelligentes du marché. Il supporte LZMA (7-zip), est facile à utiliser et en développement actif.

Comme il prend déjà en charge le streaming LZMA, il ne prend malheureusement en charge, au moment de la rédaction, que la lecture des archives à 7 zip. MAIS l'écriture d'archive est sur leur liste de tâches (voir le readme). Pour les futurs lecteurs: Cochez pour obtenir le statut actuel ici: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Installez le paquet NuGet appelé SevenZipSharp.Interop

Ensuite:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top