2012-06-22 20 views
11

मैं एक फ़ाइल और सी # में एक निर्देशिका को संपीड़ित करना चाहता हूं। मुझे इंटरनेट में कुछ समाधान मिला लेकिन वे बहुत जटिल हैं और मैं उन्हें अपनी परियोजना में नहीं चला सका। क्या कोई मुझे एक स्पष्ट और प्रभावी समाधान सुझा सकता है?फ़ाइलों को संपीड़ित करने के लिए

+0

आप उन्हें अपनी परियोजना में क्यों नहीं चला सकते? – BugFinder

+0

.net 4.0 http://msdn.microsoft.com/en-us/library/ms404280.aspx –

+1

में संभावित डुप्लिकेट [एक ज़िप फ़ाइल प्रोग्रामेटिक रूप से निर्देशिका को संपीड़ित करने के तरीके] में संदर्भित करें (http: // stackoverflow।कॉम/प्रश्न/24 9 8572/कैसे-से-संपीड़ित-ए-निर्देशिका-में-ए-ज़िप-फ़ाइल-प्रोग्रामेटिक रूप से) – ken2k

उत्तर

1
+0

तो आपके प्रस्तावित समाधान के लिए धन्यवाद। मैं इसकी जांच कर रहा हूं। – selentoptas

+0

@aprogrammer आपका स्वागत है। मुझे कुछ कोड पोस्ट न करने के लिए खेद है, लेकिन मुझे नहीं पता कि मेरे पास यह कहां है और मेरे पास अभी बहुत समय नहीं है – CarlosJ

0

उपयोग http://dotnetzip.codeplex.com/ फाइल या निर्देशिका ज़िप करने के लिए, वहाँ कोई अंतर्निहित वर्ग .NET में सीधे यह करने के लिए है

+0

धन्यवाद @ अर्नुड एफ। मैंने इसे देखा लेकिन मेरा प्रोग्राम ज़ीफाइल को पहचान नहीं पाया। मैं अपने कार्यक्रम में इसका वर्णन कैसे कर सकता हूं? – selentoptas

23

आप System.IO.Compression नामस्थान

में GZipStream का उपयोग कर सकते हैं

.NET 2.0.

public static void CompressFile(string path) 
{ 
    FileStream sourceFile = File.OpenRead(path); 
    FileStream destinationFile = File.Create(path + ".gz"); 

    byte[] buffer = new byte[sourceFile.Length]; 
    sourceFile.Read(buffer, 0, buffer.Length); 

    using (GZipStream output = new GZipStream(destinationFile, 
     CompressionMode.Compress)) 
    { 
     Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name, 
      destinationFile.Name, false); 

     output.Write(buffer, 0, buffer.Length); 
    } 

    // Close the files. 
    sourceFile.Close(); 
    destinationFile.Close(); 
} 

.NET 4

public static void Compress(FileInfo fi) 
    { 
     // Get the stream of the source file. 
     using (FileStream inFile = fi.OpenRead()) 
     { 
      // Prevent compressing hidden and 
      // already compressed files. 
      if ((File.GetAttributes(fi.FullName) 
       & FileAttributes.Hidden) 
       != FileAttributes.Hidden & fi.Extension != ".gz") 
      { 
       // Create the compressed file. 
       using (FileStream outFile = 
          File.Create(fi.FullName + ".gz")) 
       { 
        using (GZipStream Compress = 
         new GZipStream(outFile, 
         CompressionMode.Compress)) 
        { 
         // Copy the source file into 
         // the compression stream. 
        inFile.CopyTo(Compress); 

         Console.WriteLine("Compressed {0} from {1} to {2} bytes.", 
          fi.Name, fi.Length.ToString(), outFile.Length.ToString()); 
        } 
       } 
      } 
     } 
    } 

http://msdn.microsoft.com/en-us/library/ms404280.aspx

+0

आपके समाधान के लिए धन्यवाद लेकिन मुझे इस स्निपेट में "CopyTo" के बारे में त्रुटि है। मैं इसे हल नहीं कर सका। – selentoptas

+0

@Romil - नहीं, नामस्थान 2.0 में उपलब्ध है।, मैंने चेक किया। आप यहां सबूत भी देख सकते हैं: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.80).aspx –

+0

@ डेरेन डेविस, यूओ सही हैं, इसे 2.0 में पेश किया गया था। मैंने इसे गलत तरीके से पढ़ा, मुझे और कॉफ़ी चाहिए। –

0

Source code taken from MSDN that is compatible to .Net 2.0 and above

public static void CompressFile(string path) 
     { 
      FileStream sourceFile = File.OpenRead(path); 
      FileStream destinationFile = File.Create(path + ".gz"); 

      byte[] buffer = new byte[sourceFile.Length]; 
     sourceFile.Read(buffer, 0, buffer.Length); 

     using (GZipStream output = new GZipStream(destinationFile, 
      CompressionMode.Compress)) 
     { 
      Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name, 
       destinationFile.Name, false); 

      output.Write(buffer, 0, buffer.Length); 
     } 

     // Close the files. 
     sourceFile.Close(); 
     destinationFile.Close(); 
    } 
+0

नहीं, तो मैंने इसे फिसलने का प्रयास करने की कोशिश की लेकिन मुझे फ़ाइल पथ तक पहुंचने में कोई समस्या है। मुझे इसके बारे में एक त्रुटि है? फ़ाइल पथ तक नहीं पहुंचने का कारण क्या हो सकता है? – selentoptas

+0

क्या आप विंडोज 7 का उपयोग कर रहे हैं। –

+0

हां, मैं विंडोज 7 का उपयोग कर रहा हूं। – selentoptas

1

तुम बस का उपयोग कर सकते MS-DOS आदेश लाइन प्रोग्राम compact.exe। cmd में पैरामीटर compact.exe को देखें और .NET विधि Process.Start() का उपयोग करके इस प्रक्रिया को प्रारंभ करें।

15

मैं इस सवाल का जवाब जोड़ रहा के रूप में मैं मौजूदा जवाब में से किसी की तुलना में एक आसान तरीका मिल गया है:

  1. अपने समाधान में स्थापित DotNetZip DLLs
  2. (सबसे आसान तरीका है nuget से the package स्थापित करने के लिए है) डीएलएल में एक संदर्भ जोड़ें।
  3. नाम जोड़कर नामस्थान आयात करें: Ionic.Zip का उपयोग करके;
  4. अपनी फ़ाइल ज़िप

कोड:

using (ZipFile zip = new ZipFile()) 
{ 
    zip.AddFile("C:\test\test.txt"); 
    zip.AddFile("C:\test\test2.txt"); 
    zip.Save("C:\output.zip"); 
} 

आप मूल फ़ोल्डर संरचना ज़िप फ़ाइल में नजर आता नहीं करना चाहते हैं, तो AddFile() और AddFolder के लिए ओवरराइड को देखो() आदि

+0

सहमत है, सबसे आसान, यदि नहीं, तो सबसे आसान। – AMissico

+1

ऐसा लगता है कि DotNetZip वर्षों से अब तक बनाए रखा नहीं गया है और कुछ बड़ी फ़ाइलों को ज़िप करने में एक बग है: https://dotnetzip.codeplex.com/workitem/14087 मुझे एक ज़िप लाइब्रेरी का उपयोग करने में बहुत डरावना लगता है जो जोड़ नहीं सकता विश्वसनीय रूप से एक archieve फाइलें। क्या कोई पुष्टि कर सकता है कि DotNetZip में कोई समस्या है? –

+1

@ पीटर ह्यूबर हां इसमें यह बग है, लेकिन इसके लिए तय आपके द्वारा पोस्ट किए गए लिंक पर है। – NickG

0

DotNetZip http://dotnetzip.codeplex.com/ का उपयोग करना, वहाँ zipfile वर्ग पर एक AddDirectory() विधि है करता है कि आप क्या चाहते हैं:

using (var zip = new Ionic.Zip.ZipFile()) 
{ 
    zip.AddDirectory("DirectoryOnDisk", "rootInZipFile"); 
    zip.Save("MyFile.zip"); 
} 

बोने निरंतरता ...

1

बस फ़ाइल को संपीड़ित करने के लिए निम्न कोड का उपयोग करें।

 public void Compressfile() 
     { 
      string fileName = "Text.txt"; 
      string sourcePath = @"C:\SMSDBBACKUP"; 
      DirectoryInfo di = new DirectoryInfo(sourcePath); 
      foreach (FileInfo fi in di.GetFiles()) 
      { 
       //for specific file 
       if (fi.ToString() == fileName) 
       { 
        Compress(fi); 
       } 
      } 
     } 

public static void Compress(FileInfo fi) 
     { 
      // Get the stream of the source file. 
      using (FileStream inFile = fi.OpenRead()) 
      { 
       // Prevent compressing hidden and 
       // already compressed files. 
       if ((File.GetAttributes(fi.FullName) 
        & FileAttributes.Hidden) 
        != FileAttributes.Hidden & fi.Extension != ".gz") 
       { 
        // Create the compressed file. 
        using (FileStream outFile = 
           File.Create(fi.FullName + ".gz")) 
        { 
         using (GZipStream Compress = 
          new GZipStream(outFile, 
          CompressionMode.Compress)) 
         { 
          // Copy the source file into 
          // the compression stream. 
          inFile.CopyTo(Compress); 

          Console.WriteLine("Compressed {0} from {1} to {2} bytes.", 
           fi.Name, fi.Length.ToString(), outFile.Length.ToString()); 
         } 
        } 
       } 
      } 
     } 

    }