2011-10-04 15 views
15

Secondo questo link How do I create 7-Zip archives with .NET?, WOPR ci dicono come comprimere un file con LMZA (algoritmo di compressione 7z) utilizzando 7z SDK (http://www.7-zip.org/sdk.html)Come utilizzare l'SDK 7z per comprimere e decomprimere un file

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

Ma come decomprimerlo?

cerco:

private static void DecompressFileLZMA(string inFile, string outFile) 
     { 
      SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); 
      using (FileStream input = new FileStream(inFile, FileMode.Open)) 
      { 
       using (FileStream output = new FileStream(outFile, FileMode.Create)) 
       { 
        coder.Code(input, output, input.Length, -1, null); 
        output.Flush(); 
       } 
      } 
     } 

ma senza successo.

Avete un esempio funzionante?

Grazie

PS: Secondo un altro codice http://www.koders.com/csharp/fid43E85EE5AE7BB255C69D18ECC3288285AD67A4A4.aspx?s=zip+encoder#L5, sembra che il decoder ha bisogno di un colpo di testa, un dizionario all'inizio del file da lavorare. Questo file generato da Koders non è un archivio 7z.

public static void Decompress(Stream inStream, Stream outStream) 
    { 
     byte[] properties = new byte[5]; 
     inStream.Read(properties, 0, 5); 
     SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); 
     decoder.SetDecoderProperties(properties); 
     long outSize = 0; 
     for (int i = 0; i < 8; i++) 
     { 
      int v = inStream.ReadByte(); 
      outSize |= ((long)(byte)v) << (8 * i); 
     } 
     long compressedSize = inStream.Length - inStream.Position; 
     decoder.Code(inStream, outStream, compressedSize, outSize, null); 
    } 

L'outSize viene calcolato allo stesso modo del metodo Compress. Ma come calcolare la dimensione in uscita altrimenti?

+0

Ci sono delle eccezioni? Messaggio di errore? – PVitt

+0

ottengo un NullReferenceException su 'm_Coders [i] .init();' in Init() della classe LiteralDecoder – Djax

+0

C'è anche un po 'di risposte più complete qui: http://stackoverflow.com/ a/8775927/220904 – Vando

risposta

26

Questa domanda è un po 'vecchia, ma Google non riesce a fornire una risposta soddisfacente, quindi questo è per quelli come me che lo cercano ancora. Se si esamina la cartella LMZAAlone dell'SDK, esiste un codice che comprime e decomprime i file. Utilizzando come esempio sembrerebbe che è necessario scrivere e leggere le proprietà di encoder e decomprime la dimensione del file per il file di output:

private static void CompressFileLZMA(string inFile, string outFile) 
    { 
     SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder(); 
     FileStream input = new FileStream(inFile, FileMode.Open); 
     FileStream output = new FileStream(outFile, FileMode.Create); 

     // Write the encoder properties 
     coder.WriteCoderProperties(output); 

     // Write the decompressed file size. 
     output.Write(BitConverter.GetBytes(input.Length), 0, 8); 

     // Encode the file. 
     coder.Code(input, output, input.Length, -1, null); 
     output.Flush(); 
     output.Close(); 
    } 

    private static void DecompressFileLZMA(string inFile, string outFile) 
    { 
     SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); 
     FileStream input = new FileStream(inFile, FileMode.Open); 
     FileStream output = new FileStream(outFile, FileMode.Create); 

     // Read the decoder properties 
     byte[] properties = new byte[5]; 
     input.Read(properties, 0, 5); 

     // Read in the decompress file size. 
     byte [] fileLengthBytes = new byte[8]; 
     input.Read(fileLengthBytes, 0, 8); 
     long fileLength = BitConverter.ToInt64(fileLengthBytes, 0); 

     coder.SetDecoderProperties(properties); 
     coder.Code(input, output, input.Length, fileLength, null); 
     output.Flush(); 
     output.Close(); 
    } 

Si noti che i file creati in questo modo possono essere estratte dal programma 7zip pure ma non conserverà il loro nome file o altri metadati.

+0

So che questo è un vecchio commento (e post), ma ho provato questo codice e non funziona. Quando si apre un nuovo file di archivio, Windows 10 dice che non è valido e non lo aprirà. –

+0

L'ho provato con l'ultima versione del programma 7zip e della libreria e funziona ancora per me. Cosa intendi per Windows 10 che non è valido? Stai cercando di aprire il file con il visualizzatore di file compresso integrato in Windows Explorer? Non credo che supporti 7zip/LZMA. – Fr33dan

+0

Risulta che il visualizzatore di archivi di Windows 10 non supporta .7z. Il tuo codice funziona, tuttavia, quando estrai il file archiviato, l'estensione del file non sembra essere presente, anche se è inclusa nella stringa di input. Il file è ancora valido, manca solo l'estensione; come puoi correggere questo? –