Skip to main content

Zip file or folder

Zip file or folder using C#

Nice post by David Ribeiro.
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 (java.util.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 java.io;
using java.util.zip;
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}).MyZip.zip",
  DateTime.Now.ToString("yyyyMMdd"));  //  Zip Destiny File Name
        string theDirectory = @"C:\FolderToZip";     //  Folder to zip

        try
        {
            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
            {
                System.IO.File.Delete(ZipFileName);
                sb.Append(String.Format
  ("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 + @"\", ""));
                zos.putNextEntry(ze);

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

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

                fis.close();    //  Close input Stream
            }

            //  Close outputs
            zos.closeEntry();
            zos.close();
            fos.close();

            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:
folder_to_zip.PNG The result of the Web Application after pressing the button:
result.PNG And the zipped files on the zip folder:
zipped_folders.PNG



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#

Comments

Popular posts from this blog

Creating package in Oracle Database using Toad For Oracle

What are Packages in Oracle Database A package is  a group   of procedures, functions,  variables   and  SQL statements   created as a single unit. It is used to store together related objects. A package has two parts, Package  Specification  and Package Body.

Resolving 'Setup Account Privileges' error while installing SQL Server

A new installation of Microsoft SQL Server 2012 or Microsoft SQL Server 2008 R2 fails You see the following error message when you try to install a new instance of SQL Server 2012 or SQL Server 2008 R2: Rule "Setup account privileges" failed.

Creating Oracle stored Procedures using TOAD for Oracle

In a database management system, a  stored procedure  is a set of Structured Query Language (SQL) statements with an assigned name that's stored in the database in compiled form so that it can be shared by a number of programs. The use of  stored procedures  can be helpful in controlling  access to data, preserving  data integrity  and  improving  productivity.