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