utiliser 7zip sdk pour compresser un fichier, mais ne peut pas décompresser avec winrar ou 7zip

J’ai téléchargé le SDK 7zip à partir d’ ici .

Ensuite, j’ai utilisé ce code pour compresser un fichier en 7zip:

private static void CompressFileLZMA(ssortingng inFile, ssortingng outFile) { 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(); } } 

J’ai essayé les versions 9.20 et 9.22 bêta du SDK sur le site.

La compression semble fonctionner pour compresser mon fichier de 1,6 Mo à 239 Ko.

Cependant, si j’utilise WinRar ou 7zip pour décompresser. le fichier d’archive n’est pas reconnu par eux, l’erreur est comme

“fichier archive inconnu ou fichier endommagé”

Une idée pour ça?

Vous pouvez essayer d’utiliser le wrapper 7zSharp ou au moins parsingr le code des wrappers.

Code pour compresser le fichier (extrait de 7zSharp):

  public void EncodeSingleFile(ssortingng inFile, ssortingng outFile) { using (FileStream inStream = new FileStream(inFile, FileMode.Open, FileAccess.Read)) { using (FileStream outStream = new FileStream(outFile, FileMode.OpenOrCreate, FileAccess.Write)) { EncodeSingleFile(inStream, outStream); } } } public void EncodeSingleFile(FileStream inStream, FileStream outStream) { bool eos = false; Int32 dictionary = 1 << 21; 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"; propIDs = new CoderPropID[] { CoderPropID.DictionarySize, CoderPropID.PosStateBits, CoderPropID.LitContextBits, CoderPropID.LitPosBits, CoderPropID.Algorithm, CoderPropID.NumFastBytes, CoderPropID.MatchFinder, CoderPropID.EndMarker }; properties = new object[] { dictionary, posStateBits, litContextBits, litPosBits, algorithm, numFastBytes, mf, eos }; Encoder encoder = new Encoder(); encoder.SetCoderProperties(propIDs, properties); encoder.WriteCoderProperties(outStream); Int64 fileSize = inStream.Length; for (int i = 0; i < 8; i++) { outStream.WriteByte((Byte) (fileSize >> (8*i))); } encoder.Code(inStream, outStream, -1, -1, null); } 

Avez-vous examiné le projet d’exemple inclus avec le SDK? Il se trouve dans le dossier CS\7zip\Compress\LzmaAlone\ et contient un fichier LmzaAlone.cs contenant des LmzaAlone.cs qui LmzaAlone.cs un fichier. Il fait des choses comme ça avant d’écrire les données compressées:

 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 }; Compression.LZMA.Encoder encoder = new Compression.LZMA.Encoder(); encoder.SetCoderProperties(propIDs, properties); encoder.WriteCoderProperties(outStream); if (trainStream != null) { CDoubleStream doubleStream = new CDoubleStream(); doubleStream.s1 = trainStream; doubleStream.s2 = inStream; doubleStream.fileIndex = 0; inStream = doubleStream; long trainFileSize = trainStream.Length; doubleStream.skipSize = 0; if (trainFileSize > dictionary) doubleStream.skipSize = trainFileSize - dictionary; trainStream.Seek(doubleStream.skipSize, SeekOrigin.Begin); encoder.SetTrainSize((uint)(trainFileSize - doubleStream.skipSize)); } // only now does it write out the compressed data: encoder.Code(inStream, outStream, -1, -1, null); 

il semble donc que vous deviez d’abord écrire quelques en-têtes de fichier pour donner des détails sur les données de compression à venir.

Si vous téléchargez le code source de 7Zip, vous constaterez que le dossier doc contient un fichier 7zFormat.txt contenant une description du format des 7 fichiers zip. Cela pourrait vous aider à créer des archives valides.

Le fait qu’il fonctionne au niveau Stream suggère qu’il s’applique simplement à la logique de compression / décompression de lzm et ne constitue pas une archive réelle (une archive serait un fichier .zip ou .7z). Semblable à utiliser GZipStream ou DeflateStream – il ne produit pas d’archive. Des outils tels que WinRar et 7zip fonctionnent sur les archives.

Je pense qu’il existe un autre type dans cette API qui produit réellement une archive, mais attend plus d’informations telles que les noms de fichiers (elle acceptera presque certainement plusieurs fichiers / stream également).