Click here to Skip to main content
12,825,743 members (37,382 online)
Click here to Skip to main content
Add your own
alternative version


96 bookmarked
Posted 8 Jul 2009

C# Zip Files and/or Folders

, 8 Jul 2009 CPOL
Rate this:
Please Sign up or sign in to vote.
How to Zip files and/or folders using C#


While you're developing C# applications, you may need to perform some specific or special operations, such as zipping files to download, or sending an e-mail with a zip file attached, or performing a backup. This article proposes a solution for you to zip files and/or folders, respecting the whole tree of a folder, without the need to buy third-party solutions.


C# usually uses GZip by default, which is not exactly a zip file (it is different). So, looking up for a solution, you have two kinds of options:

  • Use third-party solutions
  • Do it by yourself 

Although there are free third-party solutions, such as...

... you may find yourself wanting to do it yourself, without these libraries, using exclusively the .NET standard libraries. This article shows the way. If you attempt to find the necessary code only on C#, you will find yourself lost. C# has code just for GZip, which is not zip. After Googling (a lot!), I've been able to find a solution, which uses a mix of C# and J#. J# provides libraries specifically to zip ( But you may be confused about "how do I use J# on C#! Easy, just add a reference to the vjslib.dll Library (see picture below), and import the namespaces to perform the zip needed actions.

add_reference.PNG - Click to enlarge image

Using the Code

The solution is quite simple, however, it requires you to select the correct methods and specific parameters. In my sample, you have a simple Web Application with a button and a label to display the result of this process. When you press the button, a mix of C# and J# is called to zip a folder. When .NET compiles the project, it will assemble this mix as one single application. (Notice that you must have J# libraries installer on your Web server, otherwise you won't be able to have this working.)

using System.IO;
using System.Text;
protected void btnZip_Click(object sender, EventArgs e)
        StringBuilder sb = new StringBuilder(); 	//  Builder to save report
        string ZipFileName = String.Format(@"C:\ZippedFolders\({0})",
		DateTime.Now.ToString("yyyyMMdd")); 	//  Zip Destiny File Name
        string theDirectory = @"C:\FolderToZip";    	//  Folder to zip

            sb.Append(String.Format("Directory To Zip: {0}.<br/>", theDirectory));
            sb.Append(String.Format("Zip file: {0}.<br/>", ZipFileName));

            string[] allFiles = Directory.GetFiles(theDirectory, "*.*",
		SearchOption.AllDirectories);   	// Get all files from
						// the folder to zip

            if (System.IO.File.Exists(ZipFileName)) 	//  Small piece of code
					// to delete zip file if it already exists
		("Deleted old Zip file: {0}.<br/>", ZipFileName));

            //  J# code to zip

            FileOutputStream fos = new FileOutputStream(ZipFileName); //  J# output
							      // stream (Zip File)
            ZipOutputStream zos = new ZipOutputStream(fos);           //  J# output zip
            zos.setLevel(9);    //  Set the level of compression.
				// It may be a value between 0 and 9

                Add each file from folder to zip, to zip file.
                This way, the tree of the folder to zip will be
                reflected on the zip file

            for (int i = 0; i < allFiles.Length; i++ )
                string sourceFile = allFiles[i];

                FileInputStream fis = new FileInputStream(sourceFile);  //  J# input
							//stream to fill zip file
                    Add the entry to the zip file (The Replace will remove the full path
                    Ex.: file C:\FolderToZip\Files\Tmp\myFile.xml,
		  will be written as Files\Tmp\myFile.xml on the zip file
                    If this code was not written, it would generate the
		  whole tree since the beginning of the FolderToZip
                    This way the zip file begins directly at the contents
		  of C:\FolderToZip

                ZipEntry ze = new ZipEntry(sourceFile.Replace(theDirectory + @"\", ""));

                sbyte[] buffer = new sbyte[1024];
                int len;

                while ((len = >= 0)
                    zos.write(buffer, 0, len);  //  Write buffer to Zip File

                fis.close();    //  Close input Stream

            //  Close outputs

            sb.Append(String.Format("Folder {0} Zipped successfully to File {1}.<br/>",
						theDirectory, ZipFileName));

        catch (Exception eX)
            sb.Append(String.Format("Error zipping folder {0}. Details: {1}.
		Stack Trace: {2}.<br/>", theDirectory, eX.Message, eX.StackTrace));

        lbReport.Text = sb.ToString();  //  Show result/report

The physical folder to zip:


The result of the Web Application after pressing the button:


And the zipped files on the zip folder:


Points of Interest

The most interesting point about this solution is that you can use both C# and J# libraries on the same code, compiling them together in order to complete a solution. C# for itself, with its standard libraries, does not provide zip methods. J# does, however, you are programming in C#. So, why not mix them together in the same solution?!?

Another interesting point is the fact that there are several solutions on the web, all of them being libraries that you can download, but you must pay for their license. This one uses .NET libraries exclusively, no third party solutions involved. 


After receiving some comments, a new version was generated, resizing the images, adding comments to the code and explaining this solution.


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


About the Author

Software Developer (Senior)
Portugal Portugal
No Biography provided

You may also be interested in...

Comments and Discussions

NewsVisual J# Redistributable Package Pin
miladamirzadeh2-Dec-10 4:35
membermiladamirzadeh2-Dec-10 4:35 
GeneralRe: Visual J# Redistributable Package Pin
Cheeso26-Jul-11 15:57
memberCheeso26-Jul-11 15:57 
AnswerRe: Visual J# Redistributable Package Pin
derekcoder27-Jul-11 16:10
memberderekcoder27-Jul-11 16:10 

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.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170308.1 | Last Updated 8 Jul 2009
Article Copyright 2009 by david.ribeiro
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid