Pergunta

Como posso criar 7-Zip arquivos do meu aplicativo C # console? Eu preciso ser capaz de extrair os arquivos usando o regular, amplamente disponível href="http://www.7-zip.org/" 7-Zip programa .


Aqui estão os meus resultados com os exemplos fornecidos como respostas a esta pergunta
  • "Descascar para fora" para 7z.exe - esta é a abordagem mais simples e eficaz, e posso confirmar que ele funciona muito bem . Como workmad3 menciona , eu só preciso garantia de que 7z.exe está instalado em todas as máquinas de destino, que é algo que eu posso garantir.
  • 7Zip em compressão de memória - refere-se comprimindo cookies "in-memory" antes de enviar para o cliente; este método parece pouco promissor. Os métodos de invólucro (empacotar o LZMA SDK ) Tipo de retorno byte[]. Quando eu escrevo a matriz byte[] para um arquivo, eu não posso extraí-lo usando 7-Zip (File.7z is not supported archive).
  • 7zSharp Wrapper (encontrado no CodePlex) - este envolve o 7z exe / LZMA SDK . Eu referenciado o projeto do meu aplicativo, e criou com sucesso alguns ficheiros de arquivo, mas eu era incapaz de extrair os arquivos usando o programa 7-Zip regulares (File.7z is not supported archive).
  • 7Zip SDK aka LZMA SDK - Eu acho que não sou suficientemente inteligente para figura como usar este (o que é por isso que eu postei aqui) ... Qualquer exemplos de código de trabalho que demonstram a criação de um arquivo 7zip que é capaz de ser extraído pelo programa 7zip regular?
  • CodeProject C # (.NET) Interface para 7-Zip Archive DLLs - só suporta extrair 7zip arquivos ... Eu preciso criá-los!
  • SharpZipLib - De acordo com a sua FAQ , SharpZipLib não suporta 7zip.

Foi útil?

Solução

Se você pode garantir o aplicativo 7-zip será instalado (e no caminho) em todas as máquinas de destino, você pode descarregar chamando o 7z linha aplicativo de comando. Não é a solução mais elegante, mas é o mínimo de trabalho.

Outras dicas

EggCafe 7Zip exemplo do bolinho Este é um exemplo (bolinho zipar) com a DLL de 7-Zip.

CodePlex Wrapper Este é um projeto open source que warp fechando função de 7z.

7Zip SDK O SDK oficial para 7zip (C, C ++, C #, Java) <--- Minha sugestão

.Net zip biblioteca por SharpDevelop.net

CodeProject exemplo, com 7zip

SharpZipLib Muitos fechando

SevenZipSharp é outra solução. Cria arquivos 7-zip ...

Aqui está um exemplo de trabalho completo usando o SDK SevenZip em C #.

Ele vai escrever e ler, arquivos 7zip padrão como as criadas pelo aplicativo Windows 7zip.

PS. O exemplo anterior foi nunca vai descomprimir porque nunca escreveu a informação propriedade necessária para o início do arquivo.

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

Eu usei o SDK.

por exemplo:

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

Apenas Instalar 7 zip de fonte e passar o parâmetro para o método.

Graças. Por favor, como a resposta.

Eu uso este código

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

Estas maneira mais fácil é trabalhar com arquivos .zip em vez de .7z e usar Dot Net Zip

Quando cisão 7zip comandos que desembolsar existem outras questões como privilégios de usuário, eu tive problema com 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 na minha opinião é uma das bibliotecas de compressão mais inteligentes lá fora. Ele suporta LZMA (7-zip), é fácil de usar e em desenvolvimento ativo.

Como tem LZMA streaming de apoio já, no momento de escrevê-lo, infelizmente só suporta o 7-Zip de leitura do arquivo. Mas escrever arquivo está em sua lista de tarefas (ver readme). Para futuros leitores: Verificação para obter o status atual aqui: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Instale o pacote NuGet chamado SevenZipSharp.Interop

Depois:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top