दिलचस्प पोस्ट
Mysql में तालिका स्तंभ नाम प्राप्त करें? Unique_ptr के साथ एक क्लास के लिए कन्वर्टर कॉपी करें नॉरटरन का क्या मतलब है? इटरेटर (या किसी अन्य विशेषता) को वापस करने का सही तरीका क्या है? क्यों है super.super.method (); जावा में अनुमति नहीं है? डेटमैटम डाटाटिप के लिए डिफ़ॉल्ट मान के रूप में अब सेट करें ()? यह पता कैसे करें कि स्ट्रिंग में निहित मूल्य डबल है या नहीं जावास्क्रिप्ट बिना स्ट्रैटेबल के अंदर स्ट्रैटेबल – जैसे PHP मैं एंड्रॉइड में नेटवर्क कनेक्शन की स्थिति कैसे देख सकता हूं? फोनगैप के साथ एक एंड्रॉइड सेवा बनाना है? (फोनगैप एप्लिकेशन को बंद होने पर भी चलाएं) सी में एक अस्थायी बिंदु संख्या से दशमलव भाग निकालें #pragma चेतावनी का प्रयोग कर रहा है / अस्थायी रूप से चेतावनी स्तर को बदलने के लिए सही तरीके से पॉप / पॉप कर रहा है? गिट को एक फाइल के बारे में "भूल" कैसे करें जिसे ट्रैक किया गया था लेकिन अब गिटग्नोर में है? एंड्रॉइड स्टूडियो में मैं 'संपत्ति' फ़ोल्डर कहां रखता हूं? सी ++ 11 ऑटो कीवर्ड के साथ कितना बड़ा है?

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

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

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

System.IO.InvalidDataException: GZip हेडर में जादू संख्या सही नहीं है। सुनिश्चित करें कि आप एक जीज़िप स्ट्रीम में जा रहे हैं ..

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

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

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

तो, मैं कैसे ज़िप फाइलों में फ़ाइलों को निकालने के लिए अपना ऐप कैसे प्राप्त करूं?

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

वेब के समाधान से एकत्रित समाधान "फ़ाइलों को प्रोग्रामेटिक रूप से अनजिप करें .net"

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

.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 में शामिल किया गया है। System.IO.Compression.FileSystem (धन्यवाद nateirvin … नीचे टिप्पणी देखें)

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

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

.NET 4.5+ के लिए

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

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

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

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

ZipArchive उपयोग करने के लिए, आपको ZipArchive लिए एक संदर्भ जोड़ने की आवश्यकता होगी

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

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

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

यदि आप चाहते हैं कि सभी बेहतर DeflateStream या GZipStream वर्ग है, जो कि एनएटी बीसीएल में बनाया गया है, को बदलने के लिए, डॉटनेट ज़ीप में यह भी है। डॉटनेटज़िप की डिफ्लैटस्ट्रीम और जीज़िपस्ट्रीम एक स्टैंडअलोन असेंबली में उपलब्ध हैं, जो कि। ये स्ट्रीम संपीड़न स्तर का समर्थन करते हैं और अंतर्निहित कक्षाओं की तुलना में बेहतर प्रदर्शन प्रदान करते हैं। सेट को पूरा करने के लिए एक ZlibStream भी है (आरएफसी 1950, 1 9 51, 1 9 52) …

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

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

आप zipfldr.dll का उपयोग करने का भी प्रयास कर सकते हैं। यह माइक्रोसॉफ्ट की संपीड़न पुस्तकालय है (सेंड मेन्यू से संकुचित फ़ोल्डर्स)। ऐसा लगता है कि यह एक कॉम लाइब्रेरी है लेकिन यह बिना दस्तावेज है। आप इसे प्रयोग के माध्यम से आपके लिए काम कर सकते हैं।

यहां से :

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

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

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

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

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

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

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

एम्बेड रेस्योरस से:

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

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

  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()); 
 String ZipPath = @"c:\my\data.zip"; String extractPath = @"d:\\myunzips"; ZipFile.ExtractToDirectory(ZipPath, extractPath); 

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