Angus Logan

MCMS/SPS/.NET/SQL/Microsoft Australia

Code to easily create zip files on the fly

Via Darren Neimke 

The other day I posted about a free .NET library for creating zip files on the fly:

     http://weblogs.asp.net/dneimke/archive/2005/02/23/378781.aspx

Here's a little method that I wrote which wraps the functionality of the ICSharpCode library to easily package one or more files into a zip file.

 

private static void WriteZipFile( string[] filesToZip, string writeToFilePath ) {
 try {
   if ( EnsureDirectory(writeToFilePath) ) {
     
     Crc32 crc = new Crc32();
     ZipOutputStream s = new ZipOutputStream(File.Create(writeToFilePath));
     s.SetLevel(9); // 0 - store only to 9 - means best compression
     for( int i=0; i<filesToZip.Length; i++ ) {
     
       // Must use a relative path here so that files show up in the Windows Zip File Viewer
       // .. hence the use of Path.GetFileName(...)
       ZipEntry entry = new ZipEntry(Path.GetFileName(filesToZip[i]));
       entry.DateTime = DateTime.Now;
       // Read in the 
       using(FileStream fs = File.OpenRead(filesToZip[i])) {
         byte[] buffer = new byte[fs.Length];
         fs.Read(buffer, 0, buffer.Length);
         // set Size and the crc, because the information
         // about the size and crc should be stored in the header
         // if it is not set it is automatically written in the footer.
         // (in this case size == crc == -1 in the header)
         // Some ZIP programs have problems with zip files that don't store
         // the size and crc in the header.
         entry.Size = fs.Length;
         fs.Close();
     
         crc.Reset();
         crc.Update(buffer);
         entry.Crc  = crc.Value;
         s.PutNextEntry(entry);
         s.Write(buffer, 0, buffer.Length);
       }
     }
     s.Finish();
     s.Close();
   }
 } 
 catch( Exception ex ) {
   HttpContext.Current.Trace.Warn( ex.ToString() ) ;
 }
}