2012-03-02 19 views
6

C# için ICSharpCode.SharpZipLib kullanarak, geçirilen dosyanın aslında geçerli bir zip dosyası olduğunu doğrulayabilir miyim (sağ tıklanan ve .zip olarak değiştirilmiş bir şey değil)?ICSharpCode.SharpZipLib zip dosyasını doğrular

[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 }); 

    } 

cevap

14

ZipFile.TestArchive yöntemini kullanabilirsiniz. İşte SharpZipLib bildirildi nasıl:

/// <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); 
} 

Kullanım örneği:

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

Büyük, bu tam olarak aradığım şeyi ekledim. – GoldenUser

+0

Teşekkürler, bu gerçekten temiz ve yardımsever cevap! –

+0

bu, arşivin tamamını doğrulıyor mu? Girişlerimi numaralandırabilen ~ 1GB parola korumalı bir zip dosyasına sahibim, ancak çıkarmayı gerçekleştirdiğimde% ~ 56 oranında çöküyor. Bunu çıkarmaya başlamadan önce test edebilir miyim? – Adi

0

bu bir dikkatli olun. Hemen yeniden adlandırmaya çalıştığımda, dosyada bir IOAccess hatası oluşturdu,

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

Bu kodu SharpZipLib 0.86.0'da tam olarak kullanırsam, kurucu zaten ZIP'e erişmeye çalıştığından ZipFile yapıcısında atılan bir '' 'ZipException' '' ("Merkezi dizin bulunamadı") alırım dosya. Ancak, bir örnek oluşturmadan TestArchive'yi kullanamazsınız. –

İlgili konular