2012-03-02 10 views
6

Przy użyciu ICSharpCode.SharpZipLib dla języka C#, jak mogę sprawdzić, czy przekazywany plik jest rzeczywiście prawidłowym plikiem zip (nie czymś, co zostało kliknięte prawym przyciskiem myszy i zmieniono jego nazwę na .zip)?ICSharpCode.SharpZipLib sprawdź plik zip

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

    } 

Odpowiedz

14

Można użyć metody ZipFile.TestArchive. Oto jak to jest zadeklarowana w 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); 
} 

Przykład użycia:

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

Wspaniale, dokładnie tego właśnie szukałem. – GoldenUser

+0

Dzięki, to naprawdę czysta i pomocna odpowiedź! –

+0

czy to weryfikuje całe archiwum? Mam plik zip chroniony hasłem ~ 1GB, który mogę wyliczyć poprzez jego wpisy, ale kiedy wykonuję ekstrakcję, ulega awarii o ~ 56%. Czy mogę po prostu przetestować go przed rozpoczęciem ekstrakcji? – Adi

0

Bądź ostrożny z tego. Stworzył błąd IOAccess w pliku dla mnie, gdy natychmiast próbowałam zmienić nazwę, musiałem dodać instrukcję:

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

Jeśli użyję kodu dokładnie takiego w SharpZipLib 0.86.0, otrzymam "ZipException". "(" Can not find central directory ") wygenerowany w konstruktorze ZipFile, ponieważ konstruktor próbuje już uzyskać dostęp do ZIP plik. Jednak nie można używać TestArchive bez tworzenia instancji. –