2008-08-01 17 views
42

क्या किसी को सी # में फ़ाइलों और फ़ोल्डर्स को संपीड़ित या डिक्रॉप करने का कोई अच्छा तरीका पता है? बड़ी फ़ाइलों को संभालना आवश्यक हो सकता है।फ़ोल्डर्स और फ़ाइलों को संपीड़ित/डिकंप्रेस करना

उत्तर

21

मैंने हमेशा शार्पज़िप लाइब्रेरी का उपयोग किया है।

Here's a link

+0

नोट: मुझे एक * int प्रवाह * साल पहले SharpZip कोड में बग, जिससे यह यादृच्छिक फ़ाइलों पर असफल हो गया जो कि मूल्यों का सही संयोजन था। यह सुनिश्चित नहीं है कि क्या यह कभी तय हो गया है, लेकिन स्मृति से मैंने ओवरफ्लो से बचने के लिए SharpZip स्रोत में 'int' चर को' long' में बदल दिया है। * मुझे अपने पुराने निश्चित SharpZip कोड को खोजने का प्रयास करना होगा और जांचें कि यह नवीनतम * से मेल खाता है या नहीं। –

8

आप एक 3rd-party library such as SharpZip उपयोग कर सकते हैं के रूप में टॉम ने कहा।

एक और तरीका (तृतीय पक्ष जाने के बिना) विंडोज शैल एपीआई का उपयोग करना है। आपको अपने सी # प्रोजेक्ट में माइक्रोसॉफ्ट शैल कंट्रोल और ऑटोमेशन कॉम लाइब्रेरी का संदर्भ सेट करना होगा। गेराल्ड गिब्सन पर एक उदाहरण है:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

Internet Archive's copy of the dead page

6

यह जावा में करने के लिए बहुत आसान है, और जैसा कि कहा गया है कि आप सी # से java.util.zip पुस्तकालयों में पहुंच सकता है इसके बाद के संस्करण। संदर्भ के लिए देखें:

java.util.zip javadocs
sample code

मैं इस थोड़ी देर पहले इस्तेमाल किया एक फ़ोल्डर संरचना की गहरी (पुनरावर्ती) जिप करना है, लेकिन मुझे नहीं लगता कि मैं कभी unzipping इस्तेमाल किया। अगर मैं बहुत प्रेरित हूं तो मैं उस कोड को खींच सकता हूं और बाद में इसे संपादित कर सकता हूं।

24

.NET 2.0 फ्रेमवर्क नेमस्पेस System.IO.Compression GZip और Deflate एल्गोरिदम का समर्थन करता है। यहां दो विधियां हैं जो एक बाइट स्ट्रीम को संपीड़ित और डिकंप्रेस करती हैं जिन्हें आप अपनी फ़ाइल ऑब्जेक्ट से प्राप्त कर सकते हैं। आप DefaultStream के लिए GZipStream को उस एल्गोरिदम का उपयोग करने के लिए नीचे दिए गए तरीकों में सब्सक्राइब कर सकते हैं। यह अभी भी अलग-अलग एल्गोरिदम के साथ संपीड़ित फ़ाइलों को संभालने की समस्या को छोड़ देता है।

public static byte[] Compress(byte[] data) 
{ 
    MemoryStream output = new MemoryStream(); 

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true); 
    gzip.Write(data, 0, data.Length); 
    gzip.Close(); 

    return output.ToArray(); 
} 

public static byte[] Decompress(byte[] data) 
{ 
    MemoryStream input = new MemoryStream(); 
    input.Write(data, 0, data.Length); 
    input.Position = 0; 

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true); 

    MemoryStream output = new MemoryStream(); 

    byte[] buff = new byte[64]; 
    int read = -1; 

    read = gzip.Read(buff, 0, buff.Length); 

    while (read > 0) 
    { 
     output.Write(buff, 0, read); 
     read = gzip.Read(buff, 0, buff.Length); 
    } 

    gzip.Close(); 

    return output.ToArray(); 
} 
6

GZipStream उपयोग करने के लिए वास्तव में एक अच्छी उपयोगिता है।

8

मेरा उत्तर आपकी आंखें बंद कर देगा और DotNetZip का चयन करेगा। यह एक बड़े समुदाय द्वारा परीक्षण किया गया है।

0

आप इस विधि के साथ ज़िप फ़ाइल बना सकते हैं:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name) 
    { 
     var path = HostingEnvironment.MapPath(TempPath) + name; 
     await Task.Run(() => 
     { 
      if (File.Exists(path)) File.Delete(path); 
      ZipFile.CreateFromDirectory(sourceDirectoryPath, path); 
     }); 
     return path; 
    } 

और उसके बाद आप इस तरीके से ज़िप फ़ाइल अनज़िप कर सकते हैं: ज़िप फ़ाइल पथ के साथ
1- इस विधि काम

public async Task ExtractZipFile(string filePath, string destinationDirectoryName) 
    { 
     await Task.Run(() => 
     { 
      var archive = ZipFile.Open(filePath, ZipArchiveMode.Read); 
      foreach (var entry in archive.Entries) 
      { 
       entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true); 
      } 
      archive.Dispose(); 
     }); 
    } 

2 - यह विधि ज़िप फ़ाइल स्ट्रीम

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName) 
    { 
     string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue); 
     using (FileStream output = new FileStream(filePath, FileMode.Create)) 
     { 
      await zipFile.CopyToAsync(output); 
     } 
     await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName)); 
     await Task.Run(() => File.Delete(filePath)); 
    } 
संबंधित मुद्दे