Frage

Wie kann ich 7-Zip-Archive aus meiner C # Konsolenanwendung? Ich muß in die Lage, die Archive mit dem regulären, weit verbreitet 7-Zip Programm zu extrahieren.


Hier sind meine Ergebnisse mit den Beispielen als Antworten auf diese Frage

  • „Beschuss aus“ 7z.exe - das ist die einfachste und effektivste Ansatz ist, und ich kann das bestätigen es schön funktioniert. Wie workmad3 erwähnt, ich brauche nur zu Garantie, dass 7z.exe auf allen Zielmaschinen installiert ist, das ist etwas, was ich garantieren kann.
  • 7Zip in Speicherkomprimierung - dies bezieht sich Cookies „in-memory“ vor dem Senden an den Client zu komprimieren; Diese Methode scheint ein wenig vielversprechend. Die wrapper Methoden Rückgabetyp byte[] (die LZMA SDK Verpackung). Wenn ich die byte[] Array in eine Datei schreiben, kann ich es nicht extrahiert mit 7-Zip (File.7z is not supported archive).
  • 7zSharp Wrapper (auf CodePlex gefunden) - Bricht die 7z exe / LZMA SDK . Ich verweisen das Projekt von meiner app, und es erfolgreich erstellt einige Archivdateien, aber ich war nicht in der Lage, die Dateien mit dem regulären 7-Zip-Programm (File.7z is not supported archive) zu extrahieren.
  • 7Zip SDK aka LZMA SDK - ich glaube, ich bin nicht intelligent genug, um Figur Sie heraus, wie dieses verwenden (weshalb ich hier geschrieben) ... Jede Arbeits Code-Beispiele, die die Schaffung eines 7-Zip-Archiv zeigen, die in der Lage ist, durch die regelmäßige 7zip Programm extrahiert werden?
  • Codeproject C # (.NET) Schnittstelle für 7-Zip-Archiv DLLs - nur unterstützt von 7zip-Archiven zu extrahieren ... ich brauche sie erstellen!
  • SharpZipLib - Nach ihrem FAQ , wird SharpZipLib nicht 7zip unterstützen.
War es hilfreich?

Lösung

Wenn Sie die 7-zip App garantieren können, installiert werden (und im Pfad) auf allen Zielcomputern, können Sie durch den Aufruf der Befehlszeile app 7z abzuladen. Nicht die eleganteste Lösung, aber es ist die am wenigsten Arbeit.

Andere Tipps

EggCafe 7Zip Cookie Beispiel Dies ist ein Beispiel (zippen Cookie) mit dem DLL von 7Zip.

CodePlex Wrapper Dies ist ein Open-Source-Projekt, das in Abhängigkeit von 7z Warp zippen.

7Zip SDK Die offizielle SDK für 7zip (C, C ++, C #, Java) <--- Mein Vorschlag

.Net zip Bibliothek von SharpDevelop.net

Codeproject Beispiel mit 7zip

SharpZipLib Viele zippen

SevenZipSharp ist eine andere Lösung. Erzeugt 7-Zip-Archive ...

Hier ist ein komplettes Arbeitsbeispiel des SevenZip SDK in C #.

Es wird schreiben und lesen, Standard 7-Zip-Dateien wie von der Windows-7-Zip-Anwendung erstellt.

PS. Im vorherigen Beispiel wurde nie gehen zu dekomprimieren, weil sie nie die erforderliche Eigenschaft Informationen an den Anfang der Datei.

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

habe ich das sdk.

Beispiel:

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

Just Install 7 zip von der Quelle und die Parameter an die Methode übergeben.

Danke. Bitte gerne die Antwort.

Ich benutze diesen 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();

Dieser einfachste Weg ist mit ZIP-Dateien statt .7z zu arbeiten und verwendet Dot Net Zip

Wenn Ausgründung 7zip Befehle gibt, Shell, sind andere Themen wie Benutzerrechte hatte ich Problem mit 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 ist meiner Meinung nach einer der klügsten Kompression Bibliotheken gibt. Es unterstützt LZMA (7-zip), ist einfach und in aktiver Entwicklung zu verwenden.

Wie es LZMA-Streaming-Unterstützung bereits zu der Zeit es leider nur zu schreiben, unterstützt 7-Zip-Archiv Lesen. ABER Archiv Schreiben ist auf ihrer To-do-Liste (siehe Readme). Für zukünftige Leser: Überprüfen Sie den aktuellen Status zu uns kommen: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Installieren Sie das NuGet Paket namens SevenZipSharp.Interop

Dann:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top