Go4Expert

Go4Expert (http://www.go4expert.com/)
-   ASP.NET (http://www.go4expert.com/articles/asp-net-tutorials/)
-   -   Zipping Files and folder using C# (http://www.go4expert.com/articles/zipping-files-folder-using-c-sharp-t19363/)

naimish 9Sep2009 15:40

Zipping Files and folder using C#
 

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 15Sep2009 19:35

Re: Zipping Files and folder using C#
 
please tell where i need to run this c#.net code...
and and how it zip the file & folder...

naimish 16Sep2009 08:11

Re: Zipping Files and folder using C#
 
You will need to add Reference of vjslib in your C#.NET code.

Run it in .NET's C# Version.

pradeep 22Sep2009 14:54

Re: Zipping Files and folder using C#
 
Nice, but instead woh posting the whole class like this, you could have written about the the basic functions with small code snippets.

naimish 22Sep2009 15:17

Re: Zipping Files and folder using C#
 
I have been suggested to put much more descriptive code :D

stevie teever 30Sep2009 11:41

Re: Zipping Files and folder using C#
 
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 3Oct2009 17:07

Re: Zipping Files and folder using C#
 
Nomination for Article of the month - Sep 2009 Started. Nominate this article.

rasd123 7Nov2009 06:15

Re: Zipping Files and folder using C#
 
Thanks for the info, I appreciate it.

technica 21Apr2010 11:59

Re: Zipping Files and folder using C#
 
have u written this code for yourself? Have u used it somewhere?

amplemaddy 24May2012 12:21

Re: Zipping Files and folder using C#
 
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();
        }
    }



All times are GMT +5.5. The time now is 12:33.