2013-04-17 3 views
16

मेरे पास एक फ़ोल्डर है जिसमें है। ज़िप फ़ाइलें। अब, मैं ज़िप फ़ाइलों को सी # का उपयोग करके विशिष्ट फ़ोल्डर्स में निकालना चाहता हूं, लेकिन बिना किसी बाहरी असेंबली या नेट फ्रेमवर्क 4.5 का उपयोग किए।सी # 4.0 का उपयोग करके और किसी ओपनसोर्स डीएल का उपयोग किए बिना फ़ोल्डर से सभी। ज़िप फ़ाइल को कैसे अनजिप करें?

मैंने खोज की है, लेकिन फ्रेमवर्क 4.0 या उससे नीचे का उपयोग करके * .zip फ़ाइलों को अनपॅक करने के लिए कोई समाधान नहीं मिला है।

मैंने GZipStream की कोशिश की, लेकिन यह केवल .gz और .zip फ़ाइलों का समर्थन नहीं करता है।

+1

आप ज़िप-प्रारूप के बारे में जान सकते हैं और अपने कोडेक लिख सकते हैं यदि आप तीसरे पक्ष के पुस्तकालयों के खिलाफ बहुत अधिक हैं और प्यार xp बहुत अधिक = डी – Sinatr

उत्तर

27

यहां msdn से उदाहरण है। System.IO.Compression.ZipFile सिर्फ इतना है कि के लिए बना है:

using System; 
using System.IO; 
using System.IO.Compression; 

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

      ZipFile.CreateFromDirectory(startPath, zipPath); 

      ZipFile.ExtractToDirectory(zipPath, extractPath); 
     } 
    } 
} 

संपादित करें: माफ करना, मैं याद है कि आप .NET 4.0 और नीचे में हित हो। आवश्यक .NET ढांचे 4.5 और ऊपर।

+5

मैंने उल्लेख किया है कि मेरे पास फ्रेमवर्क 4.0 है और 4.5 नहीं है तो क्षमा करें! –

+3

@ शेखर शेयर, हाँ क्षमा करें। फिर भी उत्तर किसी के लिए सहायक हो सकता है इसलिए मैं इसे छोड़ दूंगा। –

1

ZipPackage शुरू करने के लिए एक जगह हो सकती है। यह System.IO.Packaging के अंदर है और .NET 4.0

ऊपर वर्णित .NET 4.5 विधि की सादगी के पास कहीं भी नहीं है, लेकिन ऐसा लगता है कि यह वही कर सकता है जो आप चाहते हैं।

-1

.NET 4.0 Deflate और GZip ज़िप फ़ाइलों को संभाल नहीं सकता है, लेकिन आप फ़ाइलों को अनजिप करने के लिए खोल फ़ंक्शन का उपयोग कर सकते हैं।

public FolderItems Extract() 
{ 
var shell = new Shell(); 
var sf = shell.NameSpace(_zipFile.Path); 
return sf.Items(); 
} 

जब निकालने समारोह आप द्वारा

FolderItems Fits = Extract(); 
    foreach(var s in Fits) 
    { 
     shell.Namespace("TargetFolder").copyhere(s); 

    } 
0

.NET 3.5 लौटे folderItems बचा सकता है कहा जाता है इस के लिए एक DeflateStream है। आपको निर्देशिकाओं और इस तरह की जानकारी के लिए structs बनाना होगा, लेकिन पीकेवेयर ने इस जानकारी को प्रकाशित किया है। मैंने एक अनजिप उपयोगिता लिखी है और इसके लिए आप structs बनाने के बाद विशेष रूप से कठिन नहीं है।

12

मेरे पास एक ही प्रश्न था और समस्या का समाधान करने वाला एक महान और बहुत सरल लेख मिला। http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

आप Microsoft शैल नियंत्रण और ऑटोमेशन (Interop.Shell32.dll) कहा जाता COM पुस्तकालय

कोड (लेख से सिर्फ इतना अछूता लिया आप देखें कि यह कैसे सरल है) को संदर्भित करने की आवश्यकता होगी :

public static void UnZip(string zipFile, string folderPath) 
{ 
    if (!File.Exists(zipFile)) 
     throw new FileNotFoundException(); 

    if (!Directory.Exists(folderPath)) 
     Directory.CreateDirectory(folderPath); 

    Shell32.Shell objShell = new Shell32.Shell(); 
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath); 
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile); 

    foreach (var file in sourceFile.Items()) 
    { 
     destinationFolder.CopyHere(file, 4 | 16); 
    } 
} 

अत्यधिक article- वह झंडे 4 के लिए एक explenation लाता पढ़ने की सलाह | 16

संपादित करें: कई सालों बाद कि मेरा ऐप, जो इसका उपयोग करता है, चल रहा है, मुझे दो उपयोगकर्ताओं से शिकायतें मिलीं कि अचानक ऐप ने काम करना बंद कर दिया। ऐसा प्रतीत होता है कि CopyHere फ़ंक्शन temp फ़ाइलों/फ़ोल्डर्स बनाता है और इन्हें कभी हटाया नहीं गया जिससे समस्याएं उत्पन्न हुईं। इन फ़ाइलों का स्थान System.IO.Path.GetTempPath() में पाया जा सकता है।

+1

मैंने पाया कि किसी कारण से अनजिप की गई फ़ाइलों का समय मूल फ़ाइलों के समय से अलग था, क्योंकि कुछ कारणों से प्रतिलिपि फ़ाइलें सेकंड को रीसेट करती हैं। उदाहरण के लिए: मूल समय 24/6/15 08:00:35 कॉपी की गई फ़ाइल होगी: 24/6/15 08:00:00 आमतौर पर इससे कोई फर्क नहीं पड़ता है लेकिन क्लाइंट ने मुझे यह बताया है: -/ – TBD

+0

यह वास्तव में शीर्ष जवाब होना चाहिए। सरल, .NET 4 में काम करता है और बाहरी पुस्तकालयों की आवश्यकता नहीं होती है। –

+0

यह स्वीकार्य उत्तर होना चाहिए क्योंकि उसने ओपी की स्थिति का उत्तर दिया था। मैं 4.5 के साथ काम कर रहा हूं इसलिए वर्तमान उच्चतम वोट जवाब मुझे ठीक कर देता है। – user1032613

0

मैं इस प्रकार एक ही समस्या थी और सी # कोड से cmd खोल के माध्यम से 7-ज़िप निष्पादन को फोन करके इसे हल,,

string zipped_path = "xxx.7z"; 
string unzipped_path = "yyy"; 
string arguments = "e " + zipped_path + " -o" + unzipped_path; 

System.Diagnostics.Process process 
     = Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments); 

if (!(process.ExitCode == 0)) 
    throw new Exception("Unable to decompress file: " + zipped_path); 

और जहां Launch_in_Shell(...) के रूप में परिभाषित किया गया है,

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory, 
                 string FileName, 
                 string Arguments) 
{ 
     System.Diagnostics.ProcessStartInfo processInfo 
             = new System.Diagnostics.ProcessStartInfo(); 

     processInfo.WorkingDirectory = WorkingDirectory; 
     processInfo.FileName = FileName; 
     processInfo.Arguments = Arguments; 
     processInfo.UseShellExecute = true; 
     System.Diagnostics.Process process 
             = System.Diagnostics.Process.Start(processInfo); 

     return process; 
} 

कमियां : आपको अपनी मशीन में 7zip स्थापित करने की आवश्यकता है और मैंने केवल ".7z" फ़ाइलों के साथ इसे आजमाया है। उम्मीद है की यह मदद करेगा।

संबंधित मुद्दे