मैं .NET के साथ 7-ज़िप अभिलेखागार कैसे बनाऊं?


101

मैं अपने C # कंसोल एप्लिकेशन से 7-ज़िप अभिलेखागार कैसे बना सकता हूं? मुझे नियमित, व्यापक रूप से उपलब्ध 7-ज़िप प्रोग्राम का उपयोग करके अभिलेखागार निकालने में सक्षम होने की आवश्यकता है ।


इस प्रश्न के उत्तर के रूप में दिए गए उदाहरणों के साथ यहां मेरे परिणाम हैं

  • "शेलिंग आउट टू 7z.exe" - यह सबसे सरल और सबसे प्रभावी तरीका है, और मैं पुष्टि कर सकता हूं कि यह अच्छी तरह से काम करता है । जैसा कि workmad3 का उल्लेख है , मुझे बस यह गारंटी देने की आवश्यकता है कि 7z.exe सभी लक्ष्य मशीनों पर स्थापित है, जो कि मैं गारंटी दे सकता है।
  • मेमोरी संपीड़न में 7Zip - यह क्लाइंट को भेजने से पहले कुकीज़ "इन-मेमोरी" को संपीड़ित करने के लिए संदर्भित करता है; यह तरीका कुछ आशाजनक लगता है। आवरण विधियों ( LZMA SDK को लपेटकर ) वापसी प्रकार byte[]। जब मैं byte[]किसी फ़ाइल पर सरणी लिखता हूं , तो मैं इसे 7-ज़िप ( File.7z is not supported archive) का उपयोग करके नहीं निकाल सकता ।
  • 7zSharp Wrapper ( कोडप्लेक्स पर पाया गया) - यह 7z exe / LZMA SDK को लपेटता है । मैंने अपने ऐप से प्रोजेक्ट को संदर्भित किया, और इसने कुछ संग्रह फ़ाइलों को सफलतापूर्वक बनाया, लेकिन मैं नियमित 7-ज़िप प्रोग्राम ( File.7z is not supported archive) का उपयोग करके फ़ाइलों को निकालने में असमर्थ था ।
  • 7Zip SDK उर्फ ​​LZMA SDK - मुझे लगता है कि मैं यह पता लगाने के लिए पर्याप्त स्मार्ट नहीं हूं कि इसका उपयोग कैसे किया जाए (यही कारण है कि मैंने यहां पोस्ट किया है) ... कोई भी कार्यशील कोड उदाहरण जो 7zip संग्रह बनाने का प्रदर्शन करता है जो इसे निकालने में सक्षम है। नियमित 7zip कार्यक्रम?
  • 7-ज़िप पुरालेख DLL के लिए कोडप्रोजेक्ट C # (.NET) इंटरफ़ेस - केवल 7zip अभिलेखागार से निकालने का समर्थन करता है ... मुझे उन्हें बनाने की आवश्यकता है!
  • SharpZipLib - उनके FAQ के अनुसार , SharpZipLib 7zip का समर्थन नहीं करता है।

32
Google से यह न लिखें जब सभी लिंक नीचे मेरे पोस्ट से हों। लोगों के लिए बहुत सम्मानजनक नहीं है कि आपने कुछ समाधान खोजे।
पैट्रिक डेसजार्डिन्स

3
मुझे पता है कि यह पोस्ट पुरानी है, लेकिन मैंने आज अपने शोध में सेवनजिपशर नामक एक परियोजना देखी। सेवनज़िप्सप.कोडप्लेक्स.कॉम
टिमरज़

12
भविष्य के पाठकों के लिए सिर्फ चेतावनी का एक शब्द। सेवनजिप सर्प का परित्याग लगता है। आज तक नवीनतम स्थिर रिलीज (0.64) को कुछ खराब मल्टीथ्रेडिंग मुद्दों (बग के अनुसार) के साथ अगस्त 2010 में वापस जारी किया गया था। तब से केवल कुछ स्रोत कोड पोस्ट किए गए हैं।
अट्टू

जवाबों:


28

यदि आप गारंटी दे सकते हैं कि 7-ज़िप ऐप सभी टारगेट मशीनों पर (और पथ में) इंस्टॉल किया जाएगा, तो आप कमांड लाइन ऐप 7z को कॉल करके लोड कर सकते हैं। सबसे सुरुचिपूर्ण समाधान नहीं है लेकिन यह सबसे कम काम है।


7
हम वास्तव में अपने बायनेरिज़ के साथ 7z कमांड लाइन उपयोगिता को जहाज करते हैं और इसे खोल देते हैं। हमारे लिए वास्तव में अच्छी तरह से काम करता है।
डेविड मोहनद्रो

79

EggCafe 7Zip कुकी उदाहरण यह 7Zip के DLL के साथ एक उदाहरण (ज़िपिंग कुकी) है।

CodePlex Wrapper यह एक ओपन सोर्स प्रोजेक्ट है जो 7z के zipping फ़ंक्शन को ताना है।

7Zip SDK 7zip (C, C ++, C #, Java) के लिए आधिकारिक एसडीके <--- मेरा सुझाव

SharpDevelop.net द्वारा .Net ज़िप लाइब्रेरी

7zip के साथ कोडप्रोजेक्ट उदाहरण

SharpZipLib कई ज़िपिंग


हो गया और मैंने एक ओपन सोर्स प्रोजेक्ट उपयोगी भी जोड़ा।
पैट्रिक डेसजार्डिंस

1
जबरदस्त हंसी? एक स्ट्रिंग द्वारा कुकी बदलें ... एक फ़ाइल या जो भी ... lol?
पैट्रिक डेसजार्डिन्स

1
नहीं, मैं सिर्फ यह देखना चाहता हूं कि क्या कोई काम करने के लिए उदाहरण के साथ आया है ... आपके शोध के लिए धन्यवाद, लेकिन आपके द्वारा दिए गए लिंक में से कोई भी मुझे काम करने के लिए नेतृत्व करने में सक्षम नहीं है।
सिबर

2
मुझे सहमत होना होगा कि किसी के पास कोई कोड नहीं है जिसे आप कॉपी और पेस्ट कर सकते हैं। एसडीके सभी उत्तर के साथ एक है, लेकिन इसमें कुछ काम करने के लिए कुछ समय और प्रयास लगता है। मैं समझ सकता हूं कि आप इसे नहीं करना चाहते हैं। आपका दिन शुभ हो।
पैट्रिक डेसजार्डिन्स

3
वैसे भी, मैं SharpDevelop / SharpZipLib संदर्भों को हटाने का सुझाव देता हूं, क्योंकि दोनों समान हैं और वे 7-ज़िप का समर्थन नहीं करते हैं। सीबर ने 7z के लिए स्पष्ट रूप से पूछा। मैं 7z समाधान भी खोज रहा हूं क्योंकि ShaprZipLib ने संग्रह के साथ काम नहीं किया और इस धागे को पाया। ShaprZipLib एक भ्रामक संकेत है!
ओन्सोकुमारु

25

सेवनजिपर्श एक और उपाय है। 7-ज़िप अभिलेखागार बनाता है ...


7
मार्खोर का यह पद वास्तव में सेवेनजिपशर प्रोजेक्ट के निर्माता का है। सेवनजिपशर 7Zip dll के लिए प्रोग्रामेटिक एक्सेस की अनुमति देता है, जिससे यह बहुत पूर्ण विशेषताओं वाला होता है। मैंने LZMA SDK को निम्न-स्तरीय और समझने में मुश्किल पाया। इसके विपरीत, सेवेनज़िपस्पार अच्छी तरह से प्रलेखित है, उपयोग में आसान है, और इसकी परीक्षण परियोजना में कई नमूना उपयोग हैं। उदाहरणों का उपयोग करते हुए, मैं फ़ाइल या मेमोरी का उपयोग करके जल्दी से संपीड़ित और विघटित कर सकता हूं।
जॉन वाइगर

4
सेवनजिपर्सप को छोड़ दिया जाता है। प्रश्न में मेरी पिछली टिप्पणी देखें।
अट्टू

सेवनजिपस्प धीमा है। फिलहाल सबसे अनुशंसित उपाय Process.Start ("7z.exe ......) का उपयोग करना है
klm_

24

यहां C # में सेवेनजिप एसडीके का उपयोग करके एक पूर्ण कार्य उदाहरण दिया गया है।

यह विंडोज 7zip एप्लिकेशन द्वारा बनाई गई मानक 7zip फ़ाइलों को लिखेगा और पढ़ेगा।

पुनश्च। पिछला उदाहरण कभी भी विघटित होने वाला नहीं था क्योंकि इसने फ़ाइल की शुरुआत के लिए आवश्यक संपत्ति की जानकारी कभी नहीं लिखी थी।

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

15
ध्यान दें कि यह शुद्ध LZMA संपीड़न / अपघटन है। 7zip फ़ाइल प्रारूप इसके ऊपर एक परत है जो फ़ाइल नाम / पथ और अन्य फ़ाइल मेटाडेटा के साथ कई फ़ाइलों की पैकेजिंग की अनुमति देता है।
रेडक्लेक्स

1
@redcalx सही है। किसी को भी एक सुराग है कि ऊपरी, 7zip परत को कैसे संसाधित किया जाए? एक और एसओ पद का संदर्भ महान होगा :)
क्रिस्टोफर जे स्मिथ

8

मैंने एसडीके का इस्तेमाल किया।

उदाहरण के लिए:

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

7
और आप फ़ाइल को कैसे हटाएंगे? मैंने सेवेनजिप.कंपेशन .ZMA.Decoder का उपयोग करके और कोड (स्ट्रीम 1, स्ट्रीम 2, -1, -1, नल) के साथ इसे करने की कोशिश की। इसने फ्रेमवर्क से एक डेटा अपवाद दिया।
करस्टेन

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

बस स्रोत से 7 ज़िप स्थापित करें और विधि को पैरामीटर पास करें।

धन्यवाद। कृपया जवाब पसंद करें।


इसने मेरे लिए एक विंडो सेवा में 7za.exe
मार्को डुइंडम

1

मैं इस कोड का उपयोग करता हूं

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

1

बुलाया NuGet पैकेज स्थापित करें SevenZipSharp.Interop

फिर:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);

मैंने इसके साथ मौजूदा 7z-संग्रह में फ़ाइल जोड़ने की कोशिश की और भ्रष्ट संग्रह प्राप्त किया।
जियोग्राफ

1

कुछ अतिरिक्त परीक्षण-जानकारी @Orwellophile कोड पर 17.9MB टेक्स्टफाइल का उपयोग करते हुए।
"जैसा है" कोड-उदाहरण में गुण मानों का उपयोग करने से प्रदर्शन पर एक बड़ा नकारात्मक प्रभाव पड़ेगा, इसमें 14.16 सेकंड लगते हैं ।

संपत्तियों को निम्न कार्य पर सेट करने के लिए 3.91 सेकंड पर (ia संग्रह में एक ही कंटेनर जानकारी होगी जो है: आप 7zip के साथ संग्रह को निकाल सकते हैं और परीक्षण कर सकते हैं लेकिन कोई फ़ाइल नाम जानकारी नहीं है)

देशी 7zip 2 सेकंड।

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

मैंने देशी 7zip और 1,2GB SQL बैकअप फ़ाइल (.bak)
7zip (अधिकतम संपीडन) का उपयोग करके एक और परीक्षण किया : 1 मिनट
LZMA SDK (उपरोक्त संपत्ति-सेटिंग के साथ @Orwellophile): 12:26 मिनट :- /
आउटपुटफाइल लगभग एक ही आकार का ।

इसलिए मुझे लगता है कि मैं स्वयं c / c ++ इंजन के आधार पर एक समाधान का उपयोग करूँगा, ia या तो c # से निष्पादन योग्य 7zip को कॉल करेगा या स्क्वीड-बॉक्स / SevenZipSharp का उपयोग करेगा , जो कि 7zip c / c ++ dll फ़ाइल के आसपास एक आवरण है, और मुझे लगता है सेवेनजिपशार्प का सबसे नया कांटा बनने के लिए। आवरण का परीक्षण नहीं किया गया है, लेकिन मुझे उम्मीद है कि देशी 7zip की तरह ही प्रदर्शन किया जाएगा। लेकिन उम्मीद है कि यह स्ट्रीम को संपीड़ित करने की संभावना देगा, जिसे आप स्पष्ट रूप से नहीं कर सकते हैं यदि आप सीधे एक्सई को कॉल करते हैं। अन्यथा मुझे लगता है कि वहाँ exe कॉल करने से अधिक लाभ नहीं है। रैपर में कुछ अतिरिक्त निर्भरताएं हैं इसलिए यह आपके प्रकाशित प्रोजेक्ट को "क्लीनर" नहीं बनाएगा।

वैसे ऐसा लगता है कि .Net कोर टीम सिस्टम में LZMA को लागू करने पर विचार करती है। वर्ग में। Ver। 5, यह बहुत अच्छा होगा!

(मुझे पता है कि यह एक टिप्पणी की तरह है और एक उत्तर नहीं है, लेकिन कोड स्निपेट प्रदान करने में सक्षम होने के लिए यह एक टिप्पणी नहीं हो सकती है)


0

इन सबसे आसान तरीका है .7z के बजाय .zip फ़ाइलों के साथ काम करना और डॉट नेट ज़िप का उपयोग करना

जब 7zip कमांड्स को शेल करने के लिए स्पिन किया जाता है तो उपयोगकर्ता के विशेषाधिकारों की तरह अन्य मुद्दे भी हैं, मेरे पास सेवनज़िपशर के साथ मुद्दा था।

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

0

SharpCompress मेरी राय में सबसे चतुर कंप्रेशन लाइब्रेरी में से एक है। यह LZMA (7-ज़िप) का समर्थन करता है, उपयोग में आसान और सक्रिय विकास के तहत है।

चूंकि इसमें LZMA स्ट्रीमिंग सपोर्ट पहले से ही है, इसलिए इसे लिखने के समय दुर्भाग्यवश केवल 7-ज़िप आर्काइव रीडिंग सपोर्ट करता है। BUT संग्रह लेखन उनकी टूडू सूची (रीडमी देखें) पर है। भविष्य के पाठकों के लिए: वर्तमान स्थिति प्राप्त करने के लिए यहां देखें: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.