C uses ICSharpCode. SharpZipLib to realize on line compression and decompression

  • 2021-09-16 07:52:38
  • OfStack

Compressed package making is also a function needed in many projects. For example, there are a large number of files (suppose there are 10,000) to be uploaded, and it seems that uploading one by one is not reliable (by, when will it be transmitted?) At this time, we can make a compressed package zip, directly transfer this file to the server, and then decompress it in the server directory to release the files inside.

Here we choose the class library ICSharpCode. SharpZipLib to implement our requirements.

Download address: http://icsharpcode.github.io/SharpZipLib/

This component supports. NET 1.1,. NET 2.0 (3.5, 4.0),. NET CF 1.0,. NET CF 2.0

ICSharpCode. SharpZipLib provides the implementation of two compression algorithms, BZIP2 (long compression time, high compression ratio) and GZIP (high compression efficiency, low compression ratio).

First, define an enumeration for the program to indicate which compression algorithm it is.


  /// <summary>
  ///  Compression enumeration 
  /// </summary>
  public enum ZipEnum
  {
    // Long compression time and high compression ratio 
    BZIP2,

    // High compression efficiency and low compression ratio 
    GZIP
  }

Compression of individual files:


    #region  Make compressed package (single file compression) 
    /// <summary>
    ///  Make compressed package (single file compression) 
    /// </summary>
    /// <param name="sourceFileName"> Original document </param>
    /// <param name="zipFileName"> Zip file </param>
    /// <param name="zipEnum"> Enumeration of compression algorithms </param>
    /// <returns> Compression success flag </returns>
    public static bool ZipFile(string srcFileName, string zipFileName, ZipEnum zipEnum)
    {
      bool flag = true;
      try
      {
        switch (zipEnum)
        {
          case ZipEnum.BZIP2:

            FileStream inStream = File.OpenRead(srcFileName);
            FileStream outStream = File.Open(zipFileName, FileMode.Create);

            // Parameter true Indicates that after compression is complete, inStream And outStream Connections are all released 
            BZip2.Compress(inStream, outStream, true, 4096);

            inStream.Close();
            outStream.Close();


            break;
          case ZipEnum.GZIP:

            FileStream srcFile = File.OpenRead(srcFileName);

            GZipOutputStream zipFile = new GZipOutputStream(File.Open(zipFileName, FileMode.Create));

            byte[] fileData = new byte[srcFile.Length];
            srcFile.Read(fileData, 0, (int)srcFile.Length);
            zipFile.Write(fileData, 0, fileData.Length);

            srcFile.Close();
            zipFile.Close();

            break;
          default: break;
        }
      }
      catch
      {
        flag = false;
      }
      return flag;
    }
    #endregion

Unzip a single file:


    #region  Unzip package (single file unzip) 
    /// <summary>
    ///  Unzip package (single file unzip) 
    /// </summary>
    /// <param name="zipFileName"> Zip file </param>
    /// <param name="unzipFileName"> Extract a file </param>
    /// <param name="zipEnum"> Enumeration of compression algorithms </param>
    /// <returns> Compression success flag </returns>
    public static bool UnZipFile(string zipFileName, string unzipFileName, ZipEnum zipEnum)
    {
      bool flag = true;
      try
      {
        switch (zipEnum)
        {
          case ZipEnum.BZIP2:
            FileStream inStream = File.OpenRead(zipFileName);
            FileStream outStream = File.Open(unzipFileName, FileMode.Create);
            BZip2.Decompress(inStream, outStream, true);
            break;
          case ZipEnum.GZIP:
            GZipInputStream zipFile = new GZipInputStream(File.OpenRead(zipFileName));
            FileStream destFile = File.Open(unzipFileName, FileMode.Create);

            int bufferSize = 2048 * 2;
            byte[] fileData = new byte[bufferSize];

            while (bufferSize > 0)
            {
              bufferSize = zipFile.Read(fileData, 0, bufferSize);
              zipFile.Write(fileData, 0, bufferSize);
            }
            destFile.Close();
            zipFile.Close();
            break;
          default: break;
        }
      }
      catch
      {
        flag = false;
      }
      return flag;
    }
    #endregion

The above two methods can be used directly after referring to dll.
Seeing this, I believe readers have questions. What if I want to compress multiple files into one zip package? You can even encrypt files? Annotate the zip package?
Ok, I'll continue to post two methods here, both of which have been tested and available.

Compression of multiple files:


    #region  Make a compressed package (multiple files are compressed to 1 Compressed packages, support encryption, annotation) 
    /// <summary>
    ///  Make a compressed package (multiple files are compressed to 1 Compressed packages, support encryption, annotation) 
    /// </summary>
    /// <param name="topDirectoryName"> Compressed file directory </param>
    /// <param name="zipedFileName"> File name of compressed package </param>
    /// <param name="compresssionLevel"> Compression level  1-9</param>
    /// <param name="password"> Password </param>
    /// <param name="comment"> Notes </param>
    public static void ZipFiles(string topDirectoryName, string zipedFileName, int compresssionLevel, string password, string comment)
    {
      using (ZipOutputStream zos = new ZipOutputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))
      {
        if (compresssionLevel != 0)
        {
          zos.SetLevel(compresssionLevel);// Set the compression level 
        }

        if (!string.IsNullOrEmpty(password))
        {
          zos.Password = password;// Settings zip Packet encryption password 
        }

        if (!string.IsNullOrEmpty(comment))
        {
          zos.SetComment(comment);// Settings zip Comments for packages 
        }

        // Loop to set all the *.jpg Files (subdirectory search is supported) 
        foreach (string file in Directory.GetFiles(topDirectoryName, "*.jpg", SearchOption.AllDirectories))
        {
          if (File.Exists(file))
          {
            FileInfo item = new FileInfo(file);
            FileStream fs = File.OpenRead(item.FullName);
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);

            ZipEntry entry = new ZipEntry(item.Name);
            zos.PutNextEntry(entry);
            zos.Write(buffer, 0, buffer.Length);
          }
        }
      }
    }
    #endregion

Extraction of multiple files:


    #region  Unzip the package (unzip the package to the specified directory) 
    /// <summary>
    ///  Unzip the package (unzip the package to the specified directory) 
    /// </summary>
    /// <param name="zipedFileName"> Compressed package name </param>
    /// <param name="unZipDirectory"> Extract directory </param>
    /// <param name="password"> Password </param>
    public static void UnZipFiles(string zipedFileName, string unZipDirectory, string password)
    {
      using (ZipInputStream zis = new ZipInputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))
      {
        if (!string.IsNullOrEmpty(password))
        {
          zis.Password = password;// If there are encrypted files, you can set password decompression 
        }

        ZipEntry zipEntry;
        while ((zipEntry = zis.GetNextEntry()) != null)
        {
          string directoryName = Path.GetDirectoryName(unZipDirectory);
          string pathName = Path.GetDirectoryName(zipEntry.Name);
          string fileName = Path.GetFileName(zipEntry.Name);

          pathName = pathName.Replace(".", "$");
          directoryName += "\\" + pathName;

          if (!Directory.Exists(directoryName))
          {
            Directory.CreateDirectory(directoryName);
          }

          if (!string.IsNullOrEmpty(fileName))
          {
            FileStream fs = File.Create(Path.Combine(directoryName, fileName));
            int size = 2048;
            byte[] bytes = new byte[2048];
            while (true)
            {
              size = zis.Read(bytes, 0, bytes.Length);
              if (size > 0)
              {
                fs.Write(bytes, 0, size);
              }
              else
              {
                break;
              }
            }
            fs.Close();
          }
        }
      }
    }
    #endregion

When we call, we can write this:


ZipFileUtil.ZipFiles(@"E:\\test\\", "E:\\test.zip", 1, "admin", "this is admin's comment.");// Make a compressed package  

ZipFileUtil.UnZipFiles("E:\\test.zip", "E:\\guwei4037\\", "admin");// Decompress package  


Related articles: