Comment créer des archives 7-Zip avec .NET?

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


Voici mes résultats avec les exemples fournis comme réponses à cette question

  • “Shelling out” to 7z.exe – c’est l’approche la plus simple et la plus efficace, et je peux confirmer que cela fonctionne bien . Comme le mentionne workmad3 , je dois juste garantir que 7z.exe est installé sur toutes les machines cibles, ce que je peux garantir.
  • 7Zip en compression de mémoire – il s’agit de compresser les cookies “en mémoire” avant de les envoyer au client; cette méthode semble quelque peu prometteuse. Les méthodes wrapper (encapsulant le SDK LZMA ) renvoient le type byte[] . Lorsque j’écris le tableau d’ byte[] dans un fichier, je ne peux pas l’extraire à l’aide de 7-Zip (l’ File.7z is not supported archive ).
  • 7zSharp Wrapper (trouvé sur CodePlex) – cela enveloppe le SDK exe / LZMA 7z. J’ai référencé le projet à partir de mon application et il a réussi à créer des fichiers d’archive, mais je n’ai pas pu extraire les fichiers à l’aide du programme 7-Zip File.7z is not supported archive (l’ File.7z is not supported archive ).
  • 7Zip SDK alias LZMA SDK – Je suppose que je ne suis pas assez intelligent pour savoir comment l’utiliser (c’est pourquoi j’ai posté ici) … Tout exemple de code de travail démontrant la création d’une archive 7zip pouvant être extraite par le serveur. programme régulier 7zip?
  • Interface CodeProject C # (.NET) pour les DLL 7-Zip Archive – prend uniquement en charge l’extraction des archives 7zip … Je dois les créer!
  • SharpZipLib – Selon leur FAQ , SharpZipLib ne supporte pas 7zip.

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

Exemple de cookie EggCafe 7Zip Voici un exemple (cookie de compression) avec la DLL de 7Zip.

CodePlex Wrapper Il s’agit d’un projet open source dont la fonction de compression est de 7z.

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

Bibliothèque zip .Net par SharpDevelop.net

Exemple CodeProject avec 7zip

SharpZipLib Beaucoup de compressions

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

Voici un exemple complet d’utilisation du 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 ne devait jamais être décompressé car il n’a jamais écrit les informations de propriété requirejses 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(ssortingng inFile, ssortingng 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(ssortingng inFile, ssortingng 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(ssortingng inFile, ssortingng 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(); } } } 
  ssortingng zipfile = @"E:\Folderx\NPPES.zip"; ssortingng folder = @"E:\TargetFolderx"; ExtractFile(zipfile,folder); public void ExtractFile(ssortingng source, ssortingng destination) { // If the directory doesn't exist, create it. if (!Directory.Exists(destination)) Directory.CreateDirectory(destination); //ssortingng zPath = ConfigurationManager.AppSettings["FileExtactorEXE"]; // ssortingng zPath = Properties.Settings.Default.FileExtactorEXE; ; ssortingng 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) { } } 

Installez simplement 7 zip à partir de la source et passez le paramètre à la méthode.

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

J’utilise ce code

  ssortingng PZipPath = @"C:\Program Files\7-Zip\7z.exe"; ssortingng sourceCompressDir = @"C:\Test"; ssortingng targetCompressName = @"C:\Test\abc.zip"; ssortingng CompressName = targetCompressName.Split('\\').Last(); ssortingng[] fileCompressList = Directory.GetFiles(sourceCompressDir, "*.*"); if (fileCompressList.Length == 0) { MessageBox.Show("No file in directory", "Important Message"); return; } ssortingng filetozip = null; foreach (ssortingng 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(); 

Ce moyen le plus simple est de travailler avec des fichiers .zip au lieu de .7z et d’utiliser Dot Net Zip

Lorsque vous désactivez les commandes 7zip pour effectuer un shell, vous rencontrez d’autres problèmes, tels que les privilèges utilisateur, avec SevenZipSharp.

 Private Function CompressFile(filename As Ssortingng) 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. Il prend en charge LZMA (7-zip), est facile à utiliser et en développement actif.

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