C# 简单的压缩文件夹

需要引用的命名空间

using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

 

    /// <summary>
    /// 压缩文件夹
    /// </summary>
    /// <param name="dirPath">要打包的文件夹</param>
    /// <param name="GzipFileName">目标文件名</param>
    /// <param name="CompressionLevel">压缩品质级别(0~9)</param>
    /// <param name="deleteDir">是否删除原文件夹</param>
    /// <param name="GzipPath">压缩文件的路径</param>
    public static string CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir, out string GzipPath)
    {
        string result = string.Empty;
        try
        {
            //压缩文件为空时默认与压缩文件夹同一级目录
            if (GzipFileName == string.Empty)
            {
                GzipFileName = dirPath.Substring(dirPath.LastIndexOf("\\"));
                GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("\\")) + GzipFileName + ".zip";

            }
            FileStream file = File.Create(GzipFileName);

            using (ZipOutputStream zipoutputstream = new ZipOutputStream(file))
            {
                //设置压缩文件级别
                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 + 1));
                    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);
                }

                zipoutputstream.Finish();
                zipoutputstream.Close();
                file.Close();
            }
        }
        catch (Exception ex)
        {
            
        }

        if (deleteDir)
        {
            Directory.Delete(dirPath, true);
        }
        GzipPath = GzipFileName;
        result = "压缩完成";
        return result;
    }

    /// <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);
        }
    }
posted @   哎嘿_zx  阅读(656)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示