2012-03-02 12 views
6

सी # के लिए ICSharpCode.SharpZipLib का उपयोग करके, मैं कैसे सत्यापित कर सकता हूं कि फ़ाइल पास की जा रही है वास्तव में एक वैध ज़िप फ़ाइल है (ऐसा कुछ नहीं जिसे सही क्लिक किया गया है और .zip के नाम से बदला गया है)?ICSharpCode.SharpZipLib ज़िप फ़ाइल को सत्यापित करें

[HttpPost] 
     public ActionResult Upload(HttpPostedFileBase fileData) 
     { 
       if (fileData != null && fileData.ContentLength > 0) 
       { 
        if (Path.GetExtension(fileData.FileName) == ".zip") 
        { 
         var zipFile = Server.MapPath("~/Content/uploads/" + Path.GetFileName(fileData.FileName)); 
         fileData.SaveAs(zipFile); 

         FileStream fs = System.IO.File.OpenRead(zipFile); 
         ZipFile zf = new ZipFile(fs); 

         foreach (ZipEntry zipEntry in zf) 
         { 
          if (zipEntry.Name.EndsWith(".htm") || zipEntry.Name.EndsWith(".html")) 
          { 
           return Json(new { success = true });        
          } 
         } 
         fs.Close(); 
         fs.Dispose(); 
         System.IO.File.Delete(zipFile); 
        } 
        else 
        { 
         var fileName = Server.MapPath("~/Content/uploads/" + Path.GetFileName(fileData.FileName)); 
         fileData.SaveAs(fileName);       
         return Json(new { success = true }); 
        } 
       }      
       return Json(new { success = false }); 

    } 

उत्तर

14

आप ZipFile.TestArchive विधि का उपयोग कर सकते हैं। यह इस प्रकार से SharpZipLib में घोषित किया जाता है:

/// <summary> 
/// Test an archive for integrity/validity 
/// </summary> 
/// <param name="testData">Perform low level data Crc check</param> 
/// <returns>true if all tests pass, false otherwise</returns> 
/// <remarks>Testing will terminate on the first error found.</remarks> 
public bool TestArchive(bool testData) 
{ 
    return TestArchive(testData, TestStrategy.FindFirstError, null); 
} 

प्रयोग उदाहरण:

ZipFile zipFile = new ZipFile("archive.zip"); 
Console.WriteLine("Archive validation result: {0}", zipFile.TestArchive(true)); 
+1

बढ़िया है, यह वास्तव में मैं क्या देख रहा था: जब मैं तुरंत नाम बदलने का प्रयास किया यह मेरे लिए फाइल पर एक IOAccess त्रुटि बनाया, मैं एक का उपयोग कर बयान को जोड़ने के लिए किया था। – GoldenUser

+0

धन्यवाद, यह वास्तव में साफ और सहायक उत्तर है! –

+0

क्या यह पूरे संग्रह को सत्यापित करता है? मैं एक ~ 1GB पासवर्ड से सुरक्षित ज़िप फ़ाइल है कि मैं अपनी प्रविष्टियों के माध्यम से गणना करने में सक्षम हूँ लेकिन जब मैं निष्कर्षण प्रदर्शन यह ~ पर 56% दुर्घटनाओं की है। क्या मैं इसे निकालने से पहले बस इसका परीक्षण कर सकता हूं? – Adi

0

इस एक से सावधान रहें।

public static bool ValidateZipFile(string fileToTest) 
{ 
    bool result; 
    //Added using statement to fix IOAccess Blocking 
    using (ICSharpCode.SharpZipLib.Zip.ZipFile zip = new ICSharpCode.SharpZipLib.Zip.ZipFile(fileToTest)) 
    { 
     result = zip.TestArchive(true, TestStrategy.FindFirstError, null); 
    } 
    return result; 
} 
+0

अगर मैं SharpZipLib 0.86.0 में वास्तव में इस तरह कोड का उपयोग करें, मैं एक '' '' ZipException'''' ("केंद्रीय निर्देशिका नहीं खोजा जा सका"), zipfile निर्माता में फेंक दिया क्योंकि निर्माता पहले से ही ज़िप का उपयोग करने की कोशिश करता है फ़ाइल। हालांकि, आप उदाहरण बनाने के बिना TestArchive का उपयोग नहीं कर सकते हैं। –

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