Click here to Skip to main content
15,890,512 members
Articles / Programming Languages / C#
Alternative
Tip/Trick

Zipping using System.IO.Compression

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
24 Jan 2012CPOL 21.5K   3
Here's a .NET 3.5 version.Basic testing done./// /// http://www.codeproject.com/Tips/315115/Zip-using-System-IO-Compression /// /// mods by GNoter ~ 20120124_094448 /// - Made dotNET v3.5 compatible /// - dotNET v3.5 does not have the optional param capability that dotNET...
Here's a .NET 3.5 version.
Basic testing done.

C#
/// 
	///  http://www.codeproject.com/Tips/315115/Zip-using-System-IO-Compression
	///  
	/// mods by GNoter ~ 20120124_094448
	/// - Made dotNET v3.5 compatible
	///			- dotNET v3.5 does not have the optional param capability that dotNET v4.0 does
	///			- added extra function calls where needed
	/// - Added [limited] xml commenting
	/// - IEnumerable type changed to IList, as IEnumerable not available in dotNET v3.5.
	/// - Changed param and variable names to be more unique and more identifiable (param vs. variable vs. keyword)
	///			- case in point: "files" is too close to "System.IO.Files"; yeah, we know the diff, but not our managers...
	/// - Performance optimization:
	///    - Changed foreach to for(int z=0) loop where possible; foreach is slower than a for loop
	/// - Added "endOfCurlyBracket" markers. A personal preference, I don't care to try and guess what the end curly-bracket is for
	/// 
	public static class ZipHelper
	{

		/// 
		///
		/// 
		/// 
		/// 
		public static void ZipFiles(string pPath, IList pFiles)
		{
			CompressionOption tCompressionLevel = CompressionOption.Normal;
			ZipFiles(pPath, pFiles, tCompressionLevel);
		}//void ZipFiles(string pPath, IList pFiles)


		/// 
		/// 
		/// 
		/// 
		/// 
		/// 
		public static void ZipFiles(string pPath, IList pFiles, CompressionOption pCompressionLevel)
		{
			using (FileStream tFileStream = new FileStream(pPath, FileMode.Create))
			{ ZipHelper.ZipFilesToStream(tFileStream, pFiles, pCompressionLevel);}
		}//void ZipFiles(string pPath, IList pFiles, CompressionOption pCompressionLevel)


		/// 
		/// 
		/// 
		/// 
		/// 
		public static byte[] ZipFilesToByteArray(IList pFiles)
		{
			CompressionOption tCompressionLevel = CompressionOption.Normal;
			return ZipFilesToByteArray(pFiles, tCompressionLevel);
		}//byte[] ZipFilesToByteArray(IList pFiles)



		/// 
		/// 
		/// 
		/// 
		/// 
		/// 
		public static byte[] ZipFilesToByteArray(IList pFiles, CompressionOption pCompressionLevel)
		{
			byte[] tZipBytes = default(byte[]);

			using (MemoryStream tMemoryStream = new MemoryStream())
			{
				ZipHelper.ZipFilesToStream(tMemoryStream, pFiles, pCompressionLevel);
				tMemoryStream.Flush();
				tZipBytes = tMemoryStream.ToArray();
			}//using (MemoryStream tMemoryStream = new MemoryStream())

			return tZipBytes;
		}//byte[] ZipFilesToByteArray(IList pFiles, CompressionOption pCompressionLevel)


		/// 
		/// 
		/// 
		/// 
		/// 
		public static void Unzip(string pZipPath, string pBaseFolder)
		{
			using (FileStream tFileStream = new FileStream(pZipPath, FileMode.Open))
			{ ZipHelper.UnzipFilesFromStream(tFileStream, pZipPath); }
		}//void Unzip(string pZipPath, string pBaseFolder)


		/// 
		/// 
		/// 
		/// 
		/// 
		public static void UnzipFromByteArray(byte[] pZipData, string pBaseFolder)
		{
			using (MemoryStream tMemoryStream = new MemoryStream(pZipData))
			{ ZipHelper.UnzipFilesFromStream(tMemoryStream, pBaseFolder); 	}
		}//void UnzipFromByteArray(byte[] pZipData, string pBaseFolder)


		/// 
		/// 
		/// 
		/// 
		/// 
		/// 
		private static void ZipFilesToStream(Stream pDestination, IList pFiles, CompressionOption pCompressionLevel)
		{
			Uri tFileURI;
			string tContentType, tPath;

			using (Package package = Package.Open(pDestination, FileMode.Create))
			{
				for (int z = 0; z < pFiles.Count; z++)
				{
					tPath = pFiles[z];
					tFileURI = new Uri(@"/" + Path.GetFileName(tPath), UriKind.Relative);
					tContentType = @"data/" + ZipHelper.GetFileExtentionName(tPath);
					using (Stream tZipStream = package.CreatePart(tFileURI, tContentType, pCompressionLevel).GetStream())
					{
						using (FileStream tFileStream = new FileStream(tPath, FileMode.Open))
						{ ZipHelper.CopyStream(tFileStream, tZipStream); }
					}//using (Stream tZipStream = package.CreatePart(tFileURI, tContentType, pCompressionLevel).GetStream())
				}//for (int z = 0; z < pFiles.Count; z++)
			}//using (Package package = Package.Open(destination, FileMode.Create))
		}//void ZipFilesToStream(Stream pDestination, IList pFiles, CompressionOption pCompressionLevel)


		/// 
		/// 
		/// 
		/// 
		/// 
		private static void UnzipFilesFromStream(Stream pSource, string pBaseFolder)
		{
			string tPath = string.Empty;

			if (!Directory.Exists(pBaseFolder)) { Directory.CreateDirectory(pBaseFolder); }
			using (Package tPackage = Package.Open(pSource, FileMode.Open))
			{
				foreach (PackagePart zipPart in tPackage.GetParts())
				{
					tPath = Path.Combine(pBaseFolder, zipPart.Uri.ToString().Substring(1));
					using (Stream tZipStream = zipPart.GetStream())
					{
						using (FileStream tFileStream = new FileStream(tPath, FileMode.Create))
						{ ZipHelper.CopyStream(tZipStream, tFileStream); }
					}//using (Stream tZipStream = zipPart.GetStream())
				}
			}//using (Package tPackage = Package.Open(pSource, FileMode.Open))
		}//void UnzipFilesFromStream(Stream pSource, string pBaseFolder)


		/// 
		/// 
		/// 
		/// 
		/// 
		private static void CopyStream(Stream pSource, Stream pDestination)
		{
			const int tBufferSize = 0x1000;
			byte[] tBuffer = new byte[tBufferSize];
			int tCount = 0;

			while ((tCount = pSource.Read(tBuffer, 0, tBufferSize)) > 0)
			{ pDestination.Write(tBuffer, 0, tCount); }
		}//void CopyStream(Stream pSource, Stream pDestination)


		/// 
		/// 
		/// 
		/// 
		/// 
		private static string GetFileExtentionName(string pPath)
		{
			string tExtention = Path.GetExtension(pPath);
			if (!string.IsNullOrEmpty(tExtention) && tExtention.StartsWith("."))
			{ tExtention = tExtention.Substring(1); }

			return tExtention;
		}//string GetFileExtentionName(string pPath)
	}//static class ZipHelper

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Financial Entity
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Question[Content_Types].xml file gets generated when you unzip Pin
Vipul Mehta20-Aug-14 10:36
Vipul Mehta20-Aug-14 10:36 
GeneralDoes this support adding directories and sub directories to ... Pin
Greg Cadmes26-Jan-12 6:00
Greg Cadmes26-Jan-12 6:00 
GeneralSean, the removal of the (limited) xml comments is, well, "i... Pin
MacSpudster24-Jan-12 9:53
professionalMacSpudster24-Jan-12 9:53 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.