2012-03-02 17 views
6

Utilizzando ICSharpCode.SharpZipLib per C#, come posso verificare che il file che viene passato sia in realtà un file zip valido (non qualcosa che è stato fatto clic con il pulsante destro del mouse e rinominato come .zip)?ICSharpCode.SharpZipLib convalida file 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 }); 

    } 

risposta

14

È possibile utilizzare il metodo ZipFile.TestArchive. Ecco come è dichiarato nella 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); 
} 

Esempio di utilizzo:

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

Grande, questo è esattamente quello che stavo cercando. – GoldenUser

+0

Grazie, è davvero una risposta pulita e utile! –

+0

verifica l'intero archivio? Ho un file zip protetto da ~ 1 GB che sono in grado di enumerare attraverso le sue voci, ma quando eseguo l'estrazione si blocca a ~ 56%. Posso testarlo prima di iniziare ad estrarlo? – Adi

0

fare attenzione con questo. Ho creato un errore IOAccess sul file per me quando ho tentato immediatamente di rinominare, ho dovuto aggiungere un'istruzione using:

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

Se uso il codice esattamente come questo in SharpZipLib 0.86.0, ottengo un '' '' ZipException'''' ("Impossibile trovare la directory centrale") generato nel costruttore ZipFile, perché il costruttore tenta già di accedere allo ZIP file. Tuttavia, non è possibile utilizzare TestArchive senza creare un'istanza. –

Problemi correlati