C#使用SharpZipLib对文件进行压缩和解压

C#使用SharpZipLib对文件进行压缩和解压

使用SharpZipLib库

编写SharpZipLibHelper帮助类

csharp 复制代码
using ICSharpCode.SharpZipLib.Zip;

namespace SharpZipLib_Project
{
    public class SharpZipLibHelper
    {
        /// <summary>
        /// 多个文件或文件夹压缩
        /// </summary>
        /// <param name="sourcePaths">文件或文件夹名称</param>
        /// <param name="zipFilePath">压缩文件夹名称</param>
        public static string CompressFilesAndDirectories(string[] sourcePaths, string zipFilePath)
        {
            try
            {
                using (FileStream fsOut = File.Create(zipFilePath))
                {
                    using (ZipOutputStream zipStream = new ZipOutputStream(fsOut))
                    {
                        foreach (string sourcePath in sourcePaths)
                        {
                            if (Directory.Exists(sourcePath))
                            {
                                CompressDirectoryRecursive(sourcePath, zipStream);
                            }
                            else if (File.Exists(sourcePath))
                            {
                                CompressFile(sourcePath, zipStream);
                            }
                            else
                            {
                                Console.WriteLine($"Path '{sourcePath}' does not exist.");
                            }
                        }
                    }
                }
                return "成功";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        /// <summary>
        /// 向压缩文件添加文件
        /// </summary>
        /// <param name="sourceFilePath"></param>
        /// <param name="zipStream"></param>
        /// <returns></returns>
        private static string CompressFile(string sourceFilePath, ZipOutputStream zipStream)
        {
            try
            {
                string entryName = Path.GetFileName(sourceFilePath);
                ZipEntry newEntry = new ZipEntry(entryName);
                zipStream.PutNextEntry(newEntry);

                byte[] buffer = new byte[4096];
                using (FileStream fsIn = File.OpenRead(sourceFilePath))
                {
                    int sourceBytes;
                    do
                    {
                        sourceBytes = fsIn.Read(buffer, 0, buffer.Length);
                        zipStream.Write(buffer, 0, sourceBytes);
                    } while (sourceBytes > 0);
                }
                return "成功";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        /// <summary>
        /// 向压缩文件添加文件夹
        /// </summary>
        /// <param name="rootDirectoryPath"></param>
        /// <param name="currentDirectoryPath"></param>
        /// <param name="zipStream"></param>
        /// <returns></returns>
        private static string CompressDirectoryRecursive(string sourceDirectoryPath, ZipOutputStream zipStream)
        {
            try
            {
                string[] files = Directory.GetFiles(sourceDirectoryPath, "*", SearchOption.AllDirectories);
                string rootDirectoryName = Path.GetFileName(sourceDirectoryPath);

                // 添加文件夹本身
                ZipEntry rootDirectoryEntry = new ZipEntry(rootDirectoryName + "/");
                zipStream.PutNextEntry(rootDirectoryEntry);

                // 添加文件夹内的文件和子文件夹
                foreach (string file in files)
                {
                    string relativePath = Path.GetRelativePath(sourceDirectoryPath, file);
                    ZipEntry newEntry = new ZipEntry(rootDirectoryName + "/" + relativePath);
                    zipStream.PutNextEntry(newEntry);

                    byte[] buffer = new byte[4096];
                    using (FileStream fsIn = File.OpenRead(file))
                    {
                        int sourceBytes;
                        while ((sourceBytes = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            zipStream.Write(buffer, 0, sourceBytes);
                        }
                    }
                }
                return "成功";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="zipFilePath">压缩文件地址</param>
        /// <param name="extractPath">解压文件夹</param>
        /// <returns></returns>
        public static string DecompressFile(string zipFilePath, string extractPath)
        {
            try
            {
                if (!Directory.Exists(extractPath))
                    Directory.CreateDirectory(extractPath);

                using (FileStream fsIn = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read))
                {
                    using (ZipInputStream zipStream = new ZipInputStream(fsIn))
                    {
                        ZipEntry entry;
                        while ((entry = zipStream.GetNextEntry()) != null)
                        {
                            string entryFileName = Path.Combine(extractPath, entry.Name);
                            string directoryName = Path.GetDirectoryName(entryFileName);

                            if (directoryName.Length > 0 && !Directory.Exists(directoryName))
                                Directory.CreateDirectory(directoryName);

                            if (entry.IsFile)
                            {
                                using (FileStream fsOut = File.Create(entryFileName))
                                {
                                    byte[] buffer = new byte[4096];
                                    int sourceBytes;
                                    while ((sourceBytes = zipStream.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        fsOut.Write(buffer, 0, sourceBytes);
                                    }
                                }
                            }
                        }
                    }
                }
                return "成功";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

如何使用工具类

csharp 复制代码
private void button1_Click(object sender, EventArgs e)
{
    // 压缩文件
    string[] sourcePaths = { "example.txt", "Example", "example1.txt"};
    string str = SharpZipLibHelper.CompressFilesAndDirectories(sourcePaths, "example.zip");
    if (str != "成功")
    {
        MessageBox.Show($"压缩失败: {str}");
    }
    else
    {
        MessageBox.Show("压缩成功!");
    }
}

private void button2_Click(object sender, EventArgs e)
{
    // 解压缩文件
    string str = SharpZipLibHelper.DecompressFile("example.zip", "extracted_files");
    if (str != "成功")
    {
        MessageBox.Show($"解压失败: {str}");
    }
    else
    {
        MessageBox.Show("解压成功!");
    }
}

备注: 这种压缩方法无法压缩空的文件夹,因为空的文件夹里面没有文件路径,所有会自动忽略.如果需要添加空文件夹需要自己先判断目录是否为空,然后自己在压缩文件中创建就可以了

2024.3.13

相关推荐
凡人叶枫4 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的29 分钟前
C++纯虚函数
开发语言·c++·网络安全
火山上的企鹅1 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
JaydenAI1 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
阿狸猿1 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩2 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
袁小皮皮不皮2 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器