2013-02-10 10 views
15

मैं निम्नलिखित कोड का उपयोग कर रहा एक फ़ोल्डरSystem.IO.Compression का उपयोग कर फ़ाइल निकालने के दौरान मौजूदा फ़ाइलों को मजबूती से बदलना?

 using (ZipArchive archive = new ZipArchive(zipStream)) 
     { 
      archive.ExtractToDirectory(location); 
     } 

में सभी फ़ाइलों को निकालने के लिए लेकिन अगर एक फाइल तो मौजूद यह एक अपवाद फेंकता है। क्या मौजूदा फाइलों को प्रतिस्थापित करने के लिए संपीड़न API को बताने का कोई तरीका है।

मुझे एक फ़ाइल मिल गई है कि सभी फ़ाइल नाम पहले प्राप्त करें, फिर जांचें कि फ़ाइल मौजूद है या नहीं। लेकिन यह मेरे लिए किसी भी तरह महंगा है।

उत्तर

37

मैंने एक एक्सटेंशन बनाया है। यह करने के लिए किसी भी टिप्पणी की सराहना की संभावना बढ़ा सकता है, जब फ़ोल्डर मौजूद नहीं है

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      if (file.Name == "") 
      {// Assuming Empty for Directory 
       Directory.CreateDirectory(Path.GetDirectoryName(completeFileName)); 
       continue; 
      } 
      file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+0

का उपयोग करने के अलावा यह एक आकर्षण की तरह काम करता है। – Ravia

+0

क्या यह ज़िपफाइल बिल्टिन क्लास का उपयोग कर संभव है? – Pedro77

7

इसे देखें: Creating zip files easily in .NET 4.5। आपकी समस्या को संबोधित किया जा रहा है। वैकल्पिक रूप से, आप DotNetZip भी देख सकते हैं।

2

आप कुछ अस्थायी निर्देशिका करने के लिए फ़ाइलों को अलग कर सकते हैं और अपने गंतव्य निर्देशिका में सच

मुझे पता है कि यह एक पूर्ण समाधान नहीं है, ovveride चारा नहीं इस तरह से आप के साथ की तुलना में नकल "File.Copy" के साथ फ़ाइलें की जांच करने की आवश्यकता नहीं है कि फ़ाइल मौजूद है

+0

मेरे पास यह दिमाग भी मेरे दिमाग में है लेकिन यह मेरे लिए बहुत महंगा है। – user960567

+0

मुझे लगता है कि आपके पास अन्य विकल्प नहीं है, अन्य ढांचे –

11

इस कोड को अपवाद नहीं होगा, बजाय कि यह फ़ोल्डर बना देगा।

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      string directory = Path.GetDirectoryName(completeFileName); 

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

      if (file.Name != "") 
       file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+3

एक कॉपी बिल्ली नहीं है – FrostyFire

+2

जेएबीएफवेयरवेयर, @ user960567 के रूप में कहा गया है कि "इसमें सुधार करने के लिए कोई टिप्पणी की सराहना की जाएगी," मैं केवल अपवाद फेंकने से रोकने के लिए कुछ पंक्तियां जोड़ता हूं! यदि (! निर्देशिका.इक्सिस्ट्स (निर्देशिका)) निर्देशिका .क्रेट डायरेक्टरी (निर्देशिका); – Mohy66

+0

Coooommmmmmmmmmeennnnnnt उत्तर नहीं दे रहा है। यदि आप टिप्पणी करते हैं तो वह अधिसूचित हो जाता है और उसका कोड संपादित कर सकता है :) – FrostyFire

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