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

相关推荐
四维碎片15 分钟前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
m0_5951998522 分钟前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
IT码农-爱吃辣条24 分钟前
Three.js 初级教程大全
开发语言·javascript·three.js
爱尚你199328 分钟前
MySQL 三大日志:redo log、undo log、binlog 详解
数据库·mysql
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
染翰1 小时前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸1 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
妮妮学代码2 小时前
c#:TCP服务端管理类
java·tcp/ip·c#
小猿姐2 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
兔老大RabbitMQ2 小时前
git pull origin master失败
java·开发语言·git