C#文件夹的压缩和解压

1.下载压缩和解压的动态库并引用

  

2.代码

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{

  public class Program
  {
    static void Main()
    {
      //测试压缩
      CompressDirectory(@"C:\Users\zhao\Desktop\新建文件夹 (2)", @"C:\Users\zhao\Desktop\111111\666.zip", 9, false);
      //测试解压
      Decompress(@"C:\Users\zhao\Desktop\111111\666.zip", @"C:\Users\zhao\Desktop\111111");

      Console.Read();
    }
  /// <summary>
  /// 压缩文件夹
  /// </summary>
  /// <param name="dirPath">要打包的文件夹</param>
  /// <param name="GzipFileName">目标文件名</param>
  /// <param name="CompressionLevel">压缩品质级别(0~9)</param>
  /// <param name="deleteDir">是否删除原文件夹</param>
  public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir)
  {
    //压缩文件为空时默认与压缩文件夹同一级目录
    if (GzipFileName == string.Empty)
    {
      GzipFileName = dirPath.Substring(dirPath.LastIndexOf("\\") );
      GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("\\")) + "\\" + GzipFileName + ".zip";
    }
    using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))
    {
      //设置压缩文件级别
      zipoutputstream.SetLevel(CompressionLevel);
      Crc32 crc = new Crc32();
      Dictionary<string, DateTime> fileList = GetAllFies(dirPath);
      foreach (KeyValuePair<string, DateTime> item in fileList)
      {
        //将文件数据读到流里面
        FileStream fs = File.OpenRead(item.Key.ToString());
        byte[] buffer = new byte[fs.Length];
        //从流里读出来赋值给缓冲区
        fs.Read(buffer, 0, buffer.Length);
        ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));
        entry.DateTime = item.Value;
        entry.Size = fs.Length;
        fs.Close();
        crc.Reset();
        crc.Update(buffer);
        entry.Crc = crc.Value;
        zipoutputstream.PutNextEntry(entry);
        zipoutputstream.Write(buffer, 0, buffer.Length);
      }
    }
    if (deleteDir)
    {
      Directory.Delete(dirPath, true);
    }
  }
  /// <summary>
  /// 获取所有文件
  /// </summary>
  /// <returns></returns>
  private static Dictionary<string, DateTime> GetAllFies(string dir)
  {
    Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>();
    DirectoryInfo fileDire = new DirectoryInfo(dir);
    if (!fileDire.Exists)
    {
      throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
    }
    GetAllDirFiles(fileDire, FilesList);
    GetAllDirsFiles(fileDire.GetDirectories(), FilesList);
    return FilesList;
  }
  /// <summary>
  /// 获取一个文件夹下的所有文件夹里的文件
  /// </summary>
  /// <param name="dirs"></param>
  /// <param name="filesList"></param>
  private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList)
  {
    foreach (DirectoryInfo dir in dirs)
    {
      foreach (FileInfo file in dir.GetFiles("*.*"))
      {
        filesList.Add(file.FullName, file.LastWriteTime);
      }
      GetAllDirsFiles(dir.GetDirectories(), filesList);
    }
  }
  /// <summary>
  /// 获取一个文件夹下的文件
  /// </summary>
  /// <param name="dir">目录名称</param>
  /// <param name="filesList">文件列表HastTable</param>
  private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList)
  {
    foreach (FileInfo file in dir.GetFiles("*.*"))
    {
      filesList.Add(file.FullName, file.LastWriteTime);
    }
  }
  /// <summary>
  /// 解压缩文件
  /// </summary>
  /// <param name="GzipFile">压缩包文件名</param>
  /// <param name="targetPath">解压缩目标路径</param>
  public static void Decompress(string GzipFile, string targetPath)
  {
    //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";
    string directoryName = targetPath;
    if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录
    string CurrentDirectory = directoryName;
    byte[] data = new byte[2048];
    int size = 2048;
    ZipEntry theEntry = null;
    using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))
    {
      while ((theEntry = s.GetNextEntry()) != null)
      {
        if (theEntry.IsDirectory)
        {// 该结点是目录
          if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);
        }
        else
        {
          if (theEntry.Name != String.Empty)
          {
            // 检查多级目录是否存在
            if (theEntry.Name.Contains("\\"))
            {
              string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("\\") + 1);
              if (!Directory.Exists(parentDirPath))
              {
                Directory.CreateDirectory(CurrentDirectory + parentDirPath);
              }
            }

            //解压文件到指定的目录
            using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))
            {
              while (true)
              {
                size = s.Read(data, 0, data.Length);
                if (size <= 0) break;
                streamWriter.Write(data, 0, size);
              }
              streamWriter.Close();
            }
          }
        }
      }
      s.Close();
    }
   }
  }
}

 参考:好名字可以让你的朋友更容易记住你

猜你喜欢

转载自www.cnblogs.com/zwj-199306231519/p/10827204.html