Zipping Files and folder using C#

naimish's Avatar author of Zipping Files and folder using C#
This is an article on Zipping Files and folder using C# in ASP.NET.
Rated 5.00 By 1 users

Introduction



Zipping Files and folder without using 3rd party tools

Background



Just add reference to the solution for vjslib available with C# .NET

The code



Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using java.util;
using java.util.zip;
using java.io;
namespace BHI.Rats
{
    /// <summary>
    /// compression component
    /// </summary>
    public static class RatsCompressionManager
    {
        #region Compress and Uncompress
        /// <summary>
        /// Zips the folder name to create a zip file. 
        /// </summary>
        /// <remarks>The function is used for running as a worker thread</remarks>
        /// <param name="parameters">An array of 2 objects - folderName and zipFileName</param>
        public static void Zip(object parameters)
        {
            object[] parms = (object[])parameters;
            Zip((string)parms[0], (string)parms[1]);
        }
        /// <summary>
        /// Zips the folder name to create a zip file
        /// </summary>
        /// <param name="folderName"></param>
        /// <param name="zipFileName"></param>
        public static void Zip(string folderName, string zipFileName)
        {
            try
            {
                ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
                fz.CreateZip(zipFileName, folderName, true, "");
            }
            catch (ICSharpCode.SharpZipLib.SharpZipBaseException)
            {
                //Fail silently on cancel
                if (Directory.Exists(folderName))
                {
                    Directory.Delete(folderName, true);
                }
                if (System.IO.File.Exists(zipFileName))
                {
                    System.IO.File.Delete(zipFileName);
                }
            }
            catch
            {
                //Close silently
            }
        }
        /// <summary>
        /// Compress list of files [sourceFiles] to [zipFileName]
        /// </summary>
        /// <param name="zipFileName"></param>
        /// <param name="sourceFiles"></param>
        public static void Zip(string zipFileName, FileInfo[] sourceFiles)
        {
            try
            {
                // get the root folder. NOTE: it assums that the first file is at the root.
                string rootFolder = Path.GetDirectoryName(sourceFiles[0].FullName);
                // compress
                ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
                fz.CreateZip(zipFileName, rootFolder, true, "");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Extract [zipFileName] to [destinationPath]
        /// </summary>
        /// <param name="zipFileName"></param>
        /// <param name="destinationPath"></param>
        public static void Extract(string zipFileName, string destinationPath)
        {
            try
            {
                ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
                fz.ExtractZip(zipFileName, destinationPath, "");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Extract [zipFileName] to [destinationPath]
        /// </summary>
        /// <param name="zipFileName"></param>
        /// <param name="destinationPath"></param>
        /// <param name="fileNameToExtract">need to be the relative path in the zip file</param>
        public static void ExtractSingleFile(string zipFileName, string destinationPath, string fileNameToExtract)
        {
            try
            {
                ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
                fz.ExtractZip(zipFileName, destinationPath, fileNameToExtract);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Return a list of zip entries (compressed files meta data)
        /// </summary>
        /// <param name="zipFile"></param>
        /// <returns></returns>
        private static List<ZipEntry> getZippedFiles(ZipFile zipFile)
        {
            List<ZipEntry> zipEntries = new List<ZipEntry>();
            java.util.Enumeration zipEnum = zipFile.entries();
            while (zipEnum.hasMoreElements())
            {
                ZipEntry zip = (ZipEntry)zipEnum.nextElement();
                zipEntries.Add(zip);
            }
            return zipEntries;
        }
        /// <summary>
        /// Get the list of files in the zip file
        /// </summary>
        /// <param name="zipFileName"></param>
        /// <returns></returns>
        public static System.Collections.ArrayList GetZipEntries(string zipFileName)
        {
            System.Collections.ArrayList arrZipEntries = new System.Collections.ArrayList();
            ZipFile zipfile = new ZipFile(zipFileName);
            List<ZipEntry> zipFiles = getZippedFiles(zipfile);
            foreach (ZipEntry zipFile in zipFiles)
            {
                arrZipEntries.Add(zipFile.getName());
            }
            zipfile.close();
            System.Collections.ArrayList arrZipEntriesInside = new System.Collections.ArrayList();
            foreach (string strZipFile in arrZipEntries)
            {
                if (string.Compare(Path.GetExtension(strZipFile), ".zip", true) == 0)
                {
                    ExtractSingleFile(zipFileName, Path.GetDirectoryName(zipFileName), Path.GetFileName(strZipFile));
                    ZipFile zipfileinside = new ZipFile(Path.GetDirectoryName(zipFileName) + Path.DirectorySeparatorChar + strZipFile);
                    List<ZipEntry> zipFilesInside = getZippedFiles(zipfileinside);
                    foreach (ZipEntry zipFile in zipFilesInside)
                    {
                        arrZipEntriesInside.Add(zipFile.getName());
                    }
                    zipfileinside.close();
                }
            }
            foreach (string strFilesInsideZip in arrZipEntriesInside)
            {
                arrZipEntries.Add(strFilesInsideZip);
            }
            return arrZipEntries;
        }
        /// <summary>
        /// Extract [zipFileName] to [destinationPath] recursively
        /// </summary>
        /// <param name="zipFileName"></param>
        public static void ExtractRecursively(string zipFileName)
        {
            try
            {
                ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
                fz.ExtractZip(zipFileName, Path.GetDirectoryName(zipFileName) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(zipFileName), "");
                DirectoryInfo diInputDir = new DirectoryInfo(Path.GetDirectoryName(zipFileName) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(zipFileName));
                FileInfo[] fiInfoArr = diInputDir.GetFiles("*.zip", SearchOption.AllDirectories);
                foreach (FileInfo fiInfo in fiInfoArr)
                {
                    if (string.Compare(Path.GetExtension(fiInfo.FullName), ".zip", true) == 0)
                    {
                        ExtractRecursively(fiInfo.FullName);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}


Thank You

milan bhatt's Avatar, Join Date: Sep 2009
Newbie Member
please tell where i need to run this c#.net code...
and and how it zip the file & folder...
naimish's Avatar
Banned
You will need to add Reference of vjslib in your C#.NET code.

Run it in .NET's C# Version.
pradeep's Avatar, Join Date: Apr 2005
Team Leader
Nice, but instead woh posting the whole class like this, you could have written about the the basic functions with small code snippets.
naimish like this
naimish's Avatar
Banned
I have been suggested to put much more descriptive code
stevie teever's Avatar, Join Date: Sep 2009
Newbie Member
you must check this code..
This is not looks like the code of zip...
i don't think that it is worth wile to consider as a zip code...
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
Nomination for Article of the month - Sep 2009 Started. Nominate this article.
rasd123's Avatar
Banned
Thanks for the info, I appreciate it.
technica's Avatar, Join Date: Dec 2007
CoderByNature
have u written this code for yourself? Have u used it somewhere?
amplemaddy's Avatar, Join Date: May 2008
Newbie Member
Code:
//easy way to make zip files without any dlls
//version indipendent
public void MakeZip(string SourceFileName,string ZipFileName)// Zip functionality added by madhu
    {
        System.Diagnostics.Process scriptProc = new System.Diagnostics.Process();
        if (File.Exists(SourceFileName))
            {
            string command = "zip " + ZipFileName + " " + SourceFileName; // Building dos commands           
            System.Diagnostics.ProcessStartInfo procStartInfo =  new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
            scriptProc.StartInfo = procStartInfo;
            scriptProc.Start();
            int id = scriptProc.Id; //get process id
            start:
            System.Diagnostics.Process[] processlist = System.Diagnostics.Process.GetProcessesByName("cmd");
            foreach (System.Diagnostics.Process theprocess in processlist) 
            {
                if (theprocess.Id == id) //check proc id is found or not
                {
                    goto start;
                }                
            }
            scriptProc.Close();
        }
    }

Last edited by coderzone; 24May2012 at 16:30.. Reason: Code blocks