using System; using System.IO; using System.Collections; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.GZip; namespace BenQ.Modias.Utility ...{ /**////<summary> ///****************************************************************** ///** Creator : Venus Feng ///** Create Date : 2006-9-19 16:21 ///** Modifier : ///** Modify Date : ///** Description : Use ICSharpZipLib to ZIP File ///** ///** ///** Version No : 1.0.0 ///** ///****************************************************************** ///</summary> publicclass ZIPPER : IDisposable ...{ privatestring m_FolderToZIP; private ArrayList m_FileNamesToZIP; privatestring m_FileNameZipped; private ZipOutputStream m_ZipStream =null; private Crc32 m_Crc; Begin for Public Properties#region Begin for Public Properties /**////<summary> /// Folder Name to ZIP /// Like "C:Test" ///</summary> publicstring FolderToZIP ...{ get...{ return m_FolderToZIP; } set...{ m_FolderToZIP = value; } } /**////<summary> /// File Name to ZIP /// Like "C:TestTest.txt" ///</summary> public ArrayList FileNamesToZIP ...{ get...{ return m_FileNamesToZIP; } set...{ m_FileNamesToZIP = value; } } /**////<summary> /// Zipped File Name /// Like "C:TestMyZipFile.ZIP" ///</summary> publicstring FileNameZipped ...{ get...{ return m_FileNameZipped; } set...{ m_FileNameZipped = value; } } #endregion /**////<summary> /// The construct ///</summary> public ZIPPER() ...{ this.m_FolderToZIP =""; this.m_FileNamesToZIP =new ArrayList(); this.m_FileNameZipped =""; } ZipFolder#region ZipFolder /**////<summary> /// Zip one folder : single level /// Before doing this event, you must set the Folder and the ZIP file name you want ///</summary> publicvoid ZipFolder() ...{ if (this.m_FolderToZIP.Trim().Length ==0) ...{ thrownew Exception("You must setup the folder name you want to zip!"); } if(Directory.Exists(this.m_FolderToZIP) ==false) ...{ thrownew Exception("The folder you input does not exist! Please check it!"); } if (this.m_FileNameZipped.Trim().Length ==0) ...{ thrownew Exception("You must setup the zipped file name!"); } string[] fileNames = Directory.GetFiles(this.m_FolderToZIP.Trim()); if (fileNames.Length ==0) ...{ thrownew Exception("Can not find any file in this folder("+this.m_FolderToZIP +")!"); } // Create the Zip File this.CreateZipFile(this.m_FileNameZipped); // Zip all files foreach(string file in fileNames) ...{ this.ZipSingleFile(file); } // Close the Zip File this.CloseZipFile(); } #endregion ZipFiles#region ZipFiles /**////<summary> /// Zip files /// Before doing this event, you must set the Files name and the ZIP file name you want ///</summary> publicvoid ZipFiles() ...{ if (this.m_FileNamesToZIP.Count ==0) ...{ thrownew Exception("You must setup the files name you want to zip!"); } foreach(object file inthis.m_FileNamesToZIP) ...{ if(File.Exists(((string)file).Trim()) ==false) ...{ thrownew Exception("The file("+ (string)file +") you input does not exist! Please check it!"); } } if (this.m_FileNameZipped.Trim().Length ==0) ...{ thrownew Exception("You must input the zipped file name!"); } // Create the Zip File this.CreateZipFile(this.m_FileNameZipped); // Zip this File foreach(object file inthis.m_FileNamesToZIP) ...{ this.ZipSingleFile((string)file); } // Close the Zip File this.CloseZipFile(); } #endregion CreateZipFile#region CreateZipFile /**////<summary> /// Create Zip File by FileNameZipped ///</summary> ///<param name="fileNameZipped">zipped file name like "C:TestMyZipFile.ZIP"</param> privatevoid CreateZipFile(string fileNameZipped) ...{ this.m_Crc =new Crc32(); this.m_ZipStream =new ZipOutputStream(File.Create(fileNameZipped)); this.m_ZipStream.SetLevel(6); // 0 - store only to 9 - means best compression } #endregion CloseZipFile#region CloseZipFile /**////<summary> /// Close the Zip file ///</summary> privatevoid CloseZipFile() ...{ this.m_ZipStream.Finish(); this.m_ZipStream.Close(); this.m_ZipStream =null; } #endregion ZipSingleFile#region ZipSingleFile /**////<summary> /// Zip single file ///</summary> ///<param name="fileName">file name like "C:TestTest.txt"</param> privatevoid ZipSingleFile(string fileNameToZip) ...{ // Open and read this file FileStream fso = File.OpenRead(fileNameToZip); // Read this file to Buffer byte[] buffer =newbyte[fso.Length]; fso.Read(buffer,0,buffer.Length); // Create a new ZipEntry ZipEntry zipEntry =new ZipEntry(fileNameToZip.Split('\')[fileNameToZip.Split('\').Length -1]); zipEntry.DateTime = DateTime.Now; // 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. zipEntry.Size = fso.Length; fso.Close(); fso =null; // Using CRC to format the buffer this.m_Crc.Reset(); this.m_Crc.Update(buffer); zipEntry.Crc =this.m_Crc.Value; // Add this ZipEntry to the ZipStream this.m_ZipStream.PutNextEntry(zipEntry); this.m_ZipStream.Write(buffer,0,buffer.Length); } #endregion IDisposable member#region IDisposable member /**////<summary> /// Release all objects ///</summary> publicvoid Dispose() ...{ if(this.m_ZipStream !=null) ...{ this.m_ZipStream.Close(); this.m_ZipStream =null; } } #endregion } }