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

本文介绍了如何使用C#SharpZipLib库对文件和文件夹进行压缩与解压操作,包括多文件压缩、添加文件和文件夹以及处理空文件夹的情况。
摘要由CSDN通过智能技术生成

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

使用SharpZipLib库

编写SharpZipLibHelper帮助类

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

如何使用工具类

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值