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.
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
). File.7z is not supported archive
(l’ File.7z is not supported archive
). 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