अनजिप फ़ाइलों को प्रोग्रामेटिक रूप से .net में


221

मैं एक ज़िपित फ़ाइल को प्रोग्रामेटिक रूप से अनज़िप करने की कोशिश कर रहा हूं।

मैंने System.IO.Compression.GZipStream.NET में कक्षा का उपयोग करने की कोशिश की है , लेकिन जब मेरा ऐप चलता है (वास्तव में एक इकाई परीक्षण) तो मुझे यह अपवाद मिलता है:

System.IO.InvalidDataException: GZip हैडर में मैजिक नंबर सही नहीं है। सुनिश्चित करें कि आप GZip स्ट्रीम में गुजर रहे हैं।

मुझे अब एहसास हुआ कि एक .zipफाइल एक फाइल के समान नहीं है .gz, और यह GZipएक जैसी नहीं है Zip

हालाँकि, चूंकि मैं ज़िप्ड फ़ाइल को मैन्युअल रूप से डबल क्लिक करके फ़ाइल निकालने में सक्षम हूं और फिर "सभी फाइलें निकालें" -बटन पर क्लिक करते हुए, मुझे लगता है कि कोड में भी ऐसा करने का एक तरीका होना चाहिए।

इसलिए मैंने Process.Start()इनपुट के रूप में ज़िपित फ़ाइल के पथ के साथ उपयोग करने की कोशिश की है । यह मेरे ऐप को ज़िप की गई फ़ाइल में सामग्री दिखाने वाली विंडो खोलने का कारण बनता है। यह सब ठीक है, लेकिन एप्लिकेशन को "सभी फाइलें निकालें" -बटन पर क्लिक करने के लिए आसपास के सर्वर पर स्थापित किया जाएगा।

तो, ज़िपित फ़ाइलों में फ़ाइलों को निकालने के लिए मुझे अपना ऐप कैसे मिलेगा?

या इसे करने का एक और तरीका है? मैं किसी भी तीसरे पक्ष के पुस्तकालयों या एप्लिकेशन को डाउनलोड किए बिना इसे कोड में करना पसंद करता हूं; सुरक्षा विभाग उस बारे में बहुत कल्पना नहीं कर रहा है ...


12
आपका सुरक्षा विभाग आपके साथ एक कोड का उपयोग करने की तुलना में कुछ के लिए खुश है कि एक पुस्तकालय का उपयोग किया गया है जिसे डीबग किया गया है और संभवतः उसकी आँखों से देखा गया है? आप एक पुस्तकालय का उपयोग कर सकते हैं और "इसे कोड में करें" (स्रोत प्राप्त करें और इसे स्वयं संकलित करें), लेकिन मैं कोशिश और सच्चे पुस्तकालय का उपयोग करके किसी भी सुरक्षा मुद्दों की तुलना में पहिया को एक बड़ी समस्या के रूप में सुदृढ़ करना देखता हूं।
जारेड अपडेटाइक

10
@ जारेड - जब प्रबंधन को उनके दिमाग में एक विचार आता है ...
स्टीवन एवर्स

4
यदि आपको थर्ड पार्टी उत्पाद मिलता है, तो सुरक्षा विभाग के लिए जोखिम कम होता है। बस dotnetzip डाउनलोड करें और इसे नाम दें "[कंपनी का नाम डालें] .ziplibrary.dll"
साइमन

जवाबों:


59

हमने कई परियोजनाओं पर सफलतापूर्वक SharpZipLib का उपयोग किया है । मुझे पता है कि यह एक तृतीय पक्ष उपकरण है, लेकिन स्रोत कोड शामिल है और यदि आप यहां पहिया को सुदृढ़ करना चुनते हैं तो कुछ अंतर्दृष्टि प्रदान कर सकते हैं।


3
मैंने SharpZipLib का उपयोग करने की कोशिश की और यह ठीक काम किया। मुझे लगता है कि मुझे यह देखना होगा कि क्या तीसरे पक्ष के परिवाद और अप्स के खिलाफ निषेध एक सख्त नियम है या एक दिशानिर्देश के अधिक है।
पेट्री

10
मुझे आपकी कंपनी के बारे में पता नहीं है, लेकिन मेरा अनुभव हमेशा से यही रहा है कि यदि आप अपवाद चाहते हैं तो व्यापार मामले का विवरण लिखने पर उस तरह के नियम का अपवाद मिलना संभव है। लागत बचत v। DIY को इंगित करें, साथ ही तथ्य यह है कि स्रोत की जांच की जा सकती है। एक गिरावट के रूप में, आप अक्सर स्रोत का उपयोग करने की अनुमति प्राप्त कर सकते हैं, भले ही वे आपको dll का उपयोग न करने दें - फिर बस इसे स्वयं संकलित करें (या कम से कम उन हिस्सों को जिन्हें आपको वास्तव में उपयोग करने की आवश्यकता है ...)।
रोलैंडट्लम

ज़िप फ़ाइलों को अनकैप करने के लिए आपको बाहरी पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है, आप System32 से शेल 32 का उपयोग कर सकते हैं। कृपया stackoverflow.com/a/43066281/948694
9

490

.NET 4.5 के साथ अब आप .NET फ्रेमवर्क का उपयोग कर फाइलें खोल सकते हैं:

using System;
using System.IO;

namespace ConsoleApplication
{
  class Program
  {
    static void Main(string[] args)
    {
      string startPath = @"c:\example\start";
      string zipPath = @"c:\example\result.zip";
      string extractPath = @"c:\example\extract";

      System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
      System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
    }
  }
}

उपरोक्त कोड सीधे Microsoft के दस्तावेज़ से लिया गया था: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

ZipFileविधानसभा में निहित है System.IO.Compression.FileSystem। (साभार नैटविविन ... नीचे टिप्पणी देखें)


118
BTW, ZipFileविधानसभा में निहित है System.IO.Compression.FileSystem
नैटिरविन

73
जिसका अर्थ है कि आपको फ्रेमवर्क असेंबली में DLL संदर्भ जोड़ने की आवश्यकता है System.IO.Compression.FileSystem.dll
क्रिस शिफहैर

.rar फ़ाइलों के बारे में क्या। उपरोक्त कोड .rar फ़ाइलों को निकालने में विफल रहता है।
रघु

1
मैंने अपने asp.net कोर वेब एपीआई में यह कोशिश की, यह पहली प्रविष्टि ठीक पढ़ा, लेकिन दूसरी प्रविष्टि पर यह हमेशा त्रुटि देता है A local file header is corrupt। हालांकि इस पर कोई?
सॉफ्टसैन

@SoftSan के साथ भी। मुझे वह त्रुटि भी मिली। क्या करें?
रिच

101

.Net के लिए 4.5+

यह हमेशा डिस्क पर असम्पीडित फ़ाइल लिखने के लिए वांछित नहीं है। ASP.Net डेवलपर के रूप में, मुझे अपने सिस्टम के लिए फाइल सिस्टम पर लिखने के लिए अधिकार देने की अनुमति के साथ फिडेल करना होगा। स्मृति में धाराओं के साथ काम करके, मैं उन सभी को दरकिनार कर सकता हूं और फ़ाइलों को सीधे पढ़ सकता हूं:

using (ZipArchive archive = new ZipArchive(postedZipStream))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
         var stream = entry.Open();
         //Do awesome stream stuff!!
    }
}

वैकल्पिक रूप से, आप अभी भी कॉल करके डिस्क से विघटित फ़ाइल को डिस्क पर लिख सकते हैं ExtractToFile():

using (ZipArchive archive = ZipFile.OpenRead(pathToZip))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        entry.ExtractToFile(Path.Combine(destination, entry.FullName));
    }
} 

ZipArchiveवर्ग का उपयोग करने के लिए , आपको System.IO.Compressionनामस्थान और से एक संदर्भ जोड़ना होगा System.IO.Compression.FileSystem


8
क्या वास्तव में मूल डिकम्प्रेसर को जोड़ने के लिए 4.5+ तक MSFT लिया था?
जॉन पीटर्स

2
@JohnPeters GZipStream को .Net 2.0 ( msdn.microsoft.com/en-us/library/… ) में वापस जोड़ा गया । हालाँकि, मेमोरी में एक संग्रह में कई फ़ाइलों के साथ काम करना आसान नहीं था। नई ZipArchiveवस्तु बिल को अच्छी तरह से फिट करती है।
मिस्टर इपिक

1
यह एक विशेष रूप से अच्छा विकल्प है क्योंकि यह फ़ाइल-सिस्टम (मेरे मामले में मैं एम्बेडेड संसाधनों के साथ काम कर रहा हूं) का उपयोग किए बिना अनज़िप करने की अनुमति देता है , और यह एक तृतीय-पक्ष एक्सटेंशन भी नहीं है।
एविएव्स

1
मुझे foreachलूप का उपयोग क्यों करना चाहिए ExtractToFileजब मैं सिर्फ उपयोग कर सकता हूं ZipFile.ExtractToDirectory(inputFile, outputDir);तो पहली विधि का क्या फायदा है?
शराबी रोबोट

1
.NET 4.6.1 में मैं 'System.IO.Compression.FileSystem', किसी भी आइडिया से 'ZipArchive' प्राप्त करने में सक्षम नहीं हूं?
रवि आनंद

55

नि: शुल्क, और कोई बाहरी DLL फ़ाइलें नहीं। सब कुछ एक सीएस फाइल में है। एक डाउनलोड सिर्फ सीएस फ़ाइल है, एक और डाउनलोड उदाहरण को समझना बहुत आसान है। बस आज यह कोशिश की और मैं विश्वास नहीं कर सकता कि सेटअप कितना सरल था। इसने पहली कोशिश में काम किया, कोई त्रुटि नहीं, कुछ नहीं।

https://github.com/jaime-olivares/zipstorer


बहुत जल्द बोला! मैं तुरंत एक HTTP डाउनलोड स्ट्रीम से फ़ाइलों को बढ़ाना चाहता हूं। यह तब से काम नहीं करता है क्योंकि यह स्ट्रीम पर ऑपरेशन का उपयोग कर रहा है :( ठीक है, स्रोत कोड के लिए धन्यवाद मैं अब अपना खुद का ज़िपस्ट्रीम लिख सकता हूं ...
oyophant

मेरी समस्या का सबसे अच्छा समाधान, जब से एक updater app लिख रहा हूँ और मैं निष्कर्षण प्रक्रिया में किसी भी DLLs शामिल नहीं कर सकता तब से मैं भी अद्यतन करना होगा .... यह आपको अच्छा है! धन्यवाद!
निकलैस

27

Http://www.codeplex.com/DotNetZip पर DotNetZip लाइब्रेरी का उपयोग करें

ज़िप फ़ाइलों में हेरफेर करने के लिए क्लास लाइब्रेरी और टूलसेट। ज़िप फ़ाइलों को आसानी से बनाने, निकालने या अपडेट करने के लिए VB, C # या किसी भी .NET भाषा का उपयोग करें ...

DotNetZip पूर्ण .NET फ्रेमवर्क के साथ पीसी पर काम करता है, और यह उन मोबाइल उपकरणों पर भी चलता है जो .NET कॉम्पैक्ट फ्रेमवर्क का उपयोग करते हैं। VB, C #, या किसी भी .NET भाषा, या किसी भी स्क्रिप्टिंग वातावरण में ज़िप फ़ाइलें बनाएँ और पढ़ें ...

यदि आप चाहते हैं कि एक बेहतर DeflateStream या GZipStream क्लास है जो .NET BCL में अंतर्निहित एक को बदलने के लिए है, तो DotNetZip के पास भी है। DotNetZip का DeflateStream और GZipStream Zlib के .NET पोर्ट पर आधारित एक स्टैंडअलोन असेंबली में उपलब्ध है। ये धाराएँ संपीड़न स्तरों का समर्थन करती हैं और अंतर्निहित कक्षाओं की तुलना में बेहतर प्रदर्शन प्रदान करती हैं। सेट को पूरा करने के लिए एक ZlibStream भी है (RFC 1950, 1951, 1952) ...


1
हम्मम ... लेकिन वह एक तीसरी पार्टी लाइब्रेरी है!
पेट्रीटी

30
तुम पर कितनी निष्ठा है। जब तक आप अपने खुद के ज़िप फ़ाइल रीडर, अपने सबसे अच्छे विकल्प को लागू करने में कई महीनों का खर्च महसूस करते हैं।
सैम एक्स

यह एक तरह से SharpZipLib से बेहतर है
Kugel

5
आप मुझसे एक जवाब के बारे में सवाल पूछ रहे हैं जो लगभग 5 साल पुराना है। कुछ अनुसंधान करें। मुझे यकीन है कि आपको जवाब मिल जाएगा।
सैम एक्स

2
@PhilCooper यह एक बहुत पुराना प्रश्न है जो मैं अंतर्निहित System.IO.Compression.ZipFile का उपयोग करने की सलाह देता हूं। IIRC मेरे पास वास्तव में पिछले वर्षों में शार्पजिपलिब के साथ खराब अनुभव थे जो मक्खी पर हजारों ज़िप बनाने के मेरे अनुभव के आधार पर थे।
कुगेल

9
String ZipPath = @"c:\my\data.zip";
String extractPath = @"d:\\myunzips";
ZipFile.ExtractToDirectory(ZipPath, extractPath);

ZipFile वर्ग का उपयोग करने के लिए, आपको अपने प्रोजेक्ट में System.IO.Compression.FileSystem असेंबली का संदर्भ जोड़ना होगा



2

मानक ज़िप फाइलें आम तौर पर डिफलेट एल्गोरिथ्म का उपयोग करती हैं।

तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना फ़ाइलों को निकालने के लिए DeflateStream का उपयोग करें। आपको ज़िप फ़ाइल संग्रह प्रारूप के बारे में थोड़ी अधिक जानकारी की आवश्यकता होगी क्योंकि Microsoft केवल संपीड़न एल्गोरिदम प्रदान करता है।

आप zipfldr.dll का उपयोग करके भी देख सकते हैं। यह माइक्रोसॉफ्ट की कम्प्रेशन लाइब्रेरी (सेंड से मेन्यू में कम्प्रेस्ड फोल्डर) है। यह एक कॉम लाइब्रेरी प्रतीत होता है, लेकिन यह अनिर्दिष्ट है। आप इसे प्रयोग के माध्यम से आपके लिए काम करने में सक्षम हो सकते हैं।


मैं DeflateStream वर्ग का प्रयास कर रहा हूं। इस बार मुझे System.IO.InvalidDataException मिली: ब्लॉक की लंबाई इसके पूरक के साथ मेल नहीं खाती ..
पेटीरी

जैसा कि मैंने ऊपर कहा, Microsoft ने केवल एल्गोरिथम प्रदान किया। आपको ज़िप संग्रह प्रारूप पर भी जानकारी की आवश्यकता होगी। en.wikipedia.org/wiki/ZIP_(file_format) आपको आरंभ करना चाहिए। अधिक विस्तृत जानकारी के लिंक के लिए पृष्ठ के नीचे संदर्भ देखें।
केनेथ कोचरन

2
मैंने .NET 3.5 में System.IO.Packaging.Package भर में ठोकर खाई। ऐसा लगता है कि यह कर सकता है हालांकि यह बहुत सहज नहीं है।
केनेथ कोचरन

2

मैं इसका उपयोग कई फ़ाइलों को ज़िप या अनज़िप करने के लिए करता हूँ। रेगेक्स सामान की आवश्यकता नहीं है, लेकिन मैं इसका उपयोग तारीख की मुहर को बदलने और अवांछित अंडरस्कोर को हटाने के लिए करता हूं। यदि आवश्यक हो तो मैं सभी फ़ाइलों के लिए कुछ उपसर्ग करने के लिए संपीड़ित >> zipPath स्ट्रिंग में खाली स्ट्रिंग का उपयोग करता हूं। इसके अलावा, मैं आमतौर पर या तो कम्प्रेशन () या डेकोमप्रेस () पर आधारित टिप्पणी करता हूँ जो मैं कर रहा हूँ।

using System;
using System.IO.Compression;
using System.IO;
using System.Text.RegularExpressions;

namespace ZipAndUnzip
{
    class Program
    {
        static void Main(string[] args)
        {
            var directoryPath = new DirectoryInfo(@"C:\your_path\");

            Compress(directoryPath);
            Decompress(directoryPath);
        }

        public static void Compress(DirectoryInfo directoryPath)
        {
            foreach (DirectoryInfo directory in directoryPath.GetDirectories())
            {
                var path = directoryPath.FullName;
                var newArchiveName = Regex.Replace(directory.Name, "[0-9]{8}", "20130913");
                newArchiveName = Regex.Replace(newArchiveName, "[_]+", "_");
                string startPath = path + directory.Name;
                string zipPath = path + "" + newArchiveName + ".zip";

                ZipFile.CreateFromDirectory(startPath, zipPath);
            }

        }

        public static void Decompress(DirectoryInfo directoryPath)
        {
            foreach (FileInfo file in directoryPath.GetFiles())
            {
                var path = directoryPath.FullName;
                string zipPath = path + file.Name;
                string extractPath = Regex.Replace(path + file.Name, ".zip", "");

                ZipFile.ExtractToDirectory(zipPath, extractPath);
            }
        }


    }
}

इसके लिए डॉट नेट ४.५ की आवश्यकता होती है - सिर्फ एक नोट जो दूसरों के रूप में है जिसका जिपफाइल के साथ जवाब दिया गया है और मैं अभी भी ३.५ का उपयोग कर रहा हूं।
थ्रोंक


1

से यहाँ :

.Gz के विस्तार के साथ एक फ़ाइल में लिखी गई संपीड़ित GZipStream वस्तुएं कई सामान्य संपीड़न उपकरणों का उपयोग करके विघटित हो सकती हैं; हालाँकि, यह वर्ग स्वाभाविक रूप से .zip अभिलेखागार से फ़ाइलों को जोड़ने या निकालने के लिए कार्यक्षमता प्रदान नहीं करता है।


1

आप यह सब .NET 3.5 के भीतर DeflateStream का उपयोग करके कर सकते हैं। .NET 3.5 में कमी वाली चीज़ फ़ाइल हेडर अनुभागों को संसाधित करने की क्षमता है जो ज़िपित फ़ाइलों को व्यवस्थित करने के लिए उपयोग की जाती हैं। PKWare ने इस जानकारी को प्रकाशित किया है, जिसका उपयोग आप संरचना बनाने के बाद ज़िप फ़ाइल को संसाधित करने के लिए कर सकते हैं। यह विशेष रूप से महत्वपूर्ण नहीं है, और यह 3 पार्टी कोड का उपयोग किए बिना टूल बिल्डिंग में एक अच्छा अभ्यास है।

यह एक पंक्ति का उत्तर नहीं है, लेकिन यदि आप तैयार हैं और स्वयं समय निकालने में सक्षम हैं तो यह पूरी तरह से संभव है। मैंने एक-दो घंटे में ऐसा करने के लिए एक कक्षा लिखी और मुझे जो मिला, वह केवल 3.5% का उपयोग करके फ़ाइलों को ज़िप और अनज़िप करने की क्षमता है।


0

मुझे आज इस बारे में पता चला (नूगेट पर अनज़िप पैकेज), चूंकि मैं डॉटनेटज़िप में एक कठिन बग में भाग गया था, और मुझे एहसास हुआ कि पिछले दो वर्षों से डॉटनेटज़िप पर वास्तव में इतना काम नहीं हुआ है।

अनज़िप पैकेज दुबला है, और इसने मेरे लिए काम किया - यह बग नहीं था जो डॉटनेटज़िप के पास था। इसके अलावा, यह वास्तविक रूप से विघटन के लिए Microsoft BCL पर निर्भर एक बहुत छोटी फ़ाइल थी। मैं आसानी से समायोजन कर सकता था जिसकी मुझे आवश्यकता थी (डिकम्प्रेसिंग के दौरान प्रगति का ट्रैक रखने में सक्षम होने के लिए)। मेरा यही सुझाव है।


0

एम्बेड स्रोतों से:

using (Stream _pluginZipResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(programName + "." + "filename.zip"))
{
    using (ZipArchive zip = new ZipArchive(_pluginZipResourceStream))
    {
        zip.ExtractToDirectory(Application.StartupPath);
    }
}

0

अब तक, मैं .iso फ़ाइल को निकालने के लिए cmd प्रक्रियाओं का उपयोग कर रहा था, इसे सर्वर से एक अस्थायी पथ में कॉपी करें और एक usb स्टिक पर निकाले। हाल ही में मैंने पाया है कि यह .iso के साथ पूरी तरह से काम कर रहा है जो कि 10Gb से कम है। एक 29ob जैसे आईएसओ के लिए यह तरीका किसी तरह अटक जाता है।

    public void ExtractArchive()
    {
        try
        {

            try
            {
                Directory.Delete(copyISOLocation.OutputPath, true); 
            }
            catch (Exception e) when (e is IOException || e is UnauthorizedAccessException)
            {
            }

            Process cmd = new Process();
            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

            //stackoverflow
            cmd.StartInfo.Arguments = "-R";

            cmd.Disposed += (sender, args) => {
                Console.WriteLine("CMD Process disposed");
            };
            cmd.Exited += (sender, args) => {
                Console.WriteLine("CMD Process exited");
            };
            cmd.ErrorDataReceived += (sender, args) => {
                Console.WriteLine("CMD Process error data received");
                Console.WriteLine(args.Data);
            };
            cmd.OutputDataReceived += (sender, args) => {
                Console.WriteLine("CMD Process Output data received");
                Console.WriteLine(args.Data);
            };

            //stackoverflow


            cmd.Start();

            cmd.StandardInput.WriteLine("C:");
            //Console.WriteLine(cmd.StandardOutput.Read());
            cmd.StandardInput.Flush();

            cmd.StandardInput.WriteLine("cd C:\\\"Program Files (x86)\"\\7-Zip\\");
            //Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            cmd.StandardInput.Flush();

            cmd.StandardInput.WriteLine(string.Format("7z.exe x -o{0} {1}", copyISOLocation.OutputPath, copyISOLocation.TempIsoPath));
            //Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            cmd.StandardInput.Flush();
            cmd.StandardInput.Close();
            cmd.WaitForExit();
            Console.WriteLine(cmd.StandardOutput.ReadToEnd());
            Console.WriteLine(cmd.StandardError.ReadToEnd());

0

आप Info-unzip कमांड लाइन cod.you का उपयोग कर सकते हैं केवल Info-unzip आधिकारिक वेबसाइट से unzip.exe डाउनलोड करने की आवश्यकता है।

 internal static void Unzip(string sorcefile)
    {
        try
        {
            AFolderFiles.AFolderFilesDelete.DeleteFolder(TempBackupFolder); // delete old folder   
            AFolderFiles.AFolderFilesCreate.CreateIfNotExist(TempBackupFolder); // delete old folder   
           //need to Command command also to export attributes to a excel file
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; // window type
            startInfo.FileName = UnzipExe;
            startInfo.Arguments = sorcefile + " -d " + TempBackupFolder;
            process.StartInfo = startInfo;
            process.Start();
            //string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            process.Dispose();
            process.Close();
        }
        catch (Exception ex){ throw ex; }
    }        
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.