2012-03-02 13 views
6

ICSharpCode.SharpZipLibをC#で使用すると、渡されるファイルが実際に有効なzipファイル(右クリックされ、.zipという名前に変更されたものではない)を検証する方法を教えてください。ICSharpCode.SharpZipLib 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 }); 

    } 

答えて

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

これはまさに私が探していたものです。 – GoldenUser

+0

ありがとう、それは本当に清潔で有用な答えです! –

+0

これはアーカイブ全体を確認しますか?私は〜1GBのパスワードで保護されたzipファイルを持っていますが、エントリを列挙できますが、抽出を実行すると〜56%でクラッシュします。それを抽出し始める前にそれをテストすることはできますか? – Adi

0

はこの1つに注意してください。名前を変更しようとすぐにファイルにIOAccessエラーが発生しました。使用するステートメントを追加する必要がありました。

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でこのようなコードを使用すると、ZipFileコンストラクターにスローされた '' '' 'ZipException'''''("中央ディレクトリーが見つかりません ")が生成されます。これは、ファイル。ただし、インスタンスを作成せずにTestArchiveを使用することはできません。 –

関連する問題