zoukankan      html  css  js  c++  java
  • 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:UserszhaoDesktop新建文件夹 (2)", @"C:UserszhaoDesktop111111666.zip", 9, false);
          //测试解压
          Decompress(@"C:UserszhaoDesktop111111666.zip", @"C:UserszhaoDesktop111111");

          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();
        }
       }
      }
    }

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

    111
  • 相关阅读:
    .Net Core 第三方工具包整理
    .Net Core 读取appsettings.json的配置
    .Net Core 常见问题整理
    .Net Core 学习资料
    LVM使用
    PIP本地源搭建
    sed命令使用
    Shell脚本
    SNAT端口转发配置
    Ubuntu软件包管理
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/10827204.html
Copyright © 2011-2022 走看看