Vra

Hoe kan ek 7-Zip argiewe van my C # konsole aansoek? Ek moet in staat wees om die argiewe te onttrek met behulp van die gereelde, wyd beskikbaar 7-Zip program.


Hier is my resultate met die as antwoorde vir hierdie vraag

voorbeelde
  • "granaat uit" om 7z.exe - dit is die eenvoudigste en mees effektiewe benadering, en ek kan bevestig dat dit werk mooi . As workmad3 noem , moet ek net na waarborg dat 7z.exe geïnstalleer op alle teikengroepe masjiene, en dit is iets wat ek kan waarborg.
  • 7Zip in geheue kompressie - dit verwys na die comprimeren koekies "in-geheue" voordat die kliënt; hierdie metode blyk ietwat belowend. Die omslag metodes (wikkel die LZMA SDK ) tipe terugkeer byte[]. Wanneer ek skryf die byte[] verskeidenheid om 'n lêer, kan ek nie uitpak dit met behulp van 7-Zip (File.7z is not supported archive).
  • 7zSharp wrapper (gevind op CodePlex) - hierdie vou die 7z exe / LZMA SDK . Ek verwys die projek uit my jeug, en dit suksesvol geskep sommige argief lêers, maar ek was nie in staat om die lêers te onttrek met behulp van die gereelde 7-Zip program (File.7z is not supported archive).
  • 7Zip SDK aka LZMA SDK - ek dink ek is nie slim genoeg om figuur uit te vind hoe om dit te gebruik (wat is die rede waarom ek hier gepos) ... Enige werk kode voorbeelde wat toon die skep van 'n 7zip argief wat in staat is om te onttrek deur die gereelde 7zip program?
  • CodeProject C # (NET) Interface vir 7-Zip argief DLLs - net ondersteun onttrek uit 7zip argiewe ... Ek nodig het om hulle te skep!
  • SharpZipLib - Volgens hulle Vrae , beteken SharpZipLib nie ondersteun 7zip.
Was dit nuttig?

Oplossing

As jy kan waarborg dat die 7-zip app sal op alle teikengroepe masjiene geïnstalleer (en in die pad), kan jy laai deur die roeping van die command line app 7z. Nie die mees elegante oplossing, maar dit is die minste werk.

Ander wenke

EggCafe 7Zip koekie voorbeeld Dit is 'n voorbeeld (aanritsen koekie) met die DLL van 7Zip.

CodePlex wrapper Dit is 'n oop bron projek wat Warp aanritsen funksie van 7z.

7Zip SDK Die amptelike SDK vir 7zip (C, C ++, C #, Java) <--- My voorstel

Net zip biblioteek deur SharpDevelop.net

CodeProject voorbeeld met 7zip

SharpZipLib Baie aanritsen

SevenZipSharp is 'n ander oplossing. Skep 7-zip argiewe ...

Hier is 'n volledige werkende voorbeeld gebruik te maak van die SevenZip SDK in C #.

Dit sal skryf en lees, standaard 7zip lêers as wat deur die Windows 7zip aansoek.

PS. Die vorige voorbeeld is nooit gaan decomprimeren omdat dit nooit die nodige eiendom inligting aan die begin van die lêer geskryf.

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

Ek gebruik die SDK.

bv:

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

Net installeer 7 rits van die oorsaak en slaag die parameter om die metode.

Dankie. Asseblief graag die antwoord.

Ek gebruik hierdie kode

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

Hierdie maklikste manier is om te werk met Zip lêers in plaas van .7z en gebruik Dot Net Zip

Wanneer spin off 7zip beveel om dop daar is ander kwessies soos gebruiker voorregte, het ek n probleem met 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 is na my mening een van die slimste kompressie biblioteke daar buite. Dit word ondersteun deur LZMA (7-zip), is maklik om te gebruik en onder aktiewe ontwikkeling.

As dit LZMA streaming ondersteuning reeds ten tyde van ongelukkig skryf dit ondersteun net 7-zip argief lees. MAAR argief skrif is aan hul todo lys (sien readme). Vir toekomstige lesers: Gaan na hier die huidige status kry: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md

Die installering van die NuGet pakket genaamd SevenZipSharp.Interop

Toe:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top