导读:本期聚焦于小伙伴创作的《如何用C#实现文件夹的压缩与解压功能》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用C#实现文件夹的压缩与解压功能》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发中,文件夹的压缩与解压是常见需求,比如需要批量打包项目日志、处理用户上传的压缩包文件等。如果不想引入第三方压缩库,.NET框架自带的System.IO.Compression命名空间已经提供了完整的实现能力,下面我们就一步步实现相关功能。

如何用C#实现文件夹的压缩与解压功能

准备工作

首先需要引入必要的命名空间,这些命名空间包含了压缩解压所需的全部类和方法:

using System;
using System.IO;
using System.IO.Compression;

实现文件夹压缩功能

压缩文件夹的核心思路是创建ZipArchive对象,然后遍历源文件夹下的所有文件,将每个文件添加到压缩包中,同时保留原有的目录结构。

压缩方法实现

/// <summary>
/// 压缩文件夹为zip文件
/// </summary>
/// <param name="sourceDirPath">要压缩的源文件夹路径</param>
/// <param name="zipFilePath">生成的zip文件路径</param>
public static void CompressDirectory(string sourceDirPath, string zipFilePath)
{
    // 如果目标zip文件已存在,先删除
    if (File.Exists(zipFilePath))
    {
        File.Delete(zipFilePath);
    }
    // 创建zip文件并打开写入流
    using (FileStream zipFileStream = new FileStream(zipFilePath, FileMode.Create))
    using (ZipArchive archive = new ZipArchive(zipFileStream, ZipArchiveMode.Create))
    {
        // 获取源文件夹下所有文件,包含子目录
        string[] files = Directory.GetFiles(sourceDirPath, "*", SearchOption.AllDirectories);
        foreach (string filePath in files)
        {
            // 计算文件在压缩包中的相对路径,保留目录结构
            string relativePath = filePath.Substring(sourceDirPath.Length + 1);
            // 创建压缩包中的条目
            ZipArchiveEntry entry = archive.CreateEntry(relativePath, CompressionLevel.Optimal);
            // 写入文件内容
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            using (Stream entryStream = entry.Open())
            {
                fileStream.CopyTo(entryStream);
            }
        }
    }
    Console.WriteLine($"文件夹压缩完成,生成文件:{zipFilePath}");
}

方法说明

  • ZipArchiveMode.Create表示创建新的压缩包,如果已存在会报错,所以提前做了删除处理
  • CompressionLevel.Optimal是最高压缩等级,也可以选择CompressionLevel.Fastest提升速度但压缩率稍低
  • 通过截取源文件夹路径长度得到相对路径,确保解压后目录结构和原文件夹一致

实现文件夹解压功能

解压功能的核心是读取zip文件中的条目,创建对应的目录结构,然后将条目内容写入到目标路径的文件中。

解压方法实现

/// <summary>
/// 解压zip文件到目标文件夹
/// </summary>
/// <param name="zipFilePath">要解压的zip文件路径</param>
/// <param name="targetDirPath">解压到的目标文件夹路径</param>
public static void DecompressDirectory(string zipFilePath, string targetDirPath)
{
    // 如果目标文件夹不存在,创建文件夹
    if (!Directory.Exists(targetDirPath))
    {
        Directory.CreateDirectory(targetDirPath);
    }
    // 打开zip文件读取
    using (FileStream zipFileStream = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read))
    using (ZipArchive archive = new ZipArchive(zipFileStream, ZipArchiveMode.Read))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            // 构建目标文件的完整路径
            string targetFilePath = Path.Combine(targetDirPath, entry.FullName);
            // 如果是目录条目,创建目录
            if (string.IsNullOrEmpty(entry.Name))
            {
                Directory.CreateDirectory(targetFilePath);
                continue;
            }
            // 确保目标文件的目录存在
            string targetFileDir = Path.GetDirectoryName(targetFilePath);
            if (!Directory.Exists(targetFileDir))
            {
                Directory.CreateDirectory(targetFileDir);
            }
            // 写入文件内容
            using (Stream entryStream = entry.Open())
            using (FileStream fileStream = new FileStream(targetFilePath, FileMode.Create, FileAccess.Write))
            {
                entryStream.CopyTo(fileStream);
            }
        }
    }
    Console.WriteLine($"zip文件解压完成,解压到路径:{targetDirPath}");
}

方法说明

  • ZipArchiveMode.Read表示以读取模式打开压缩包
  • 条目分为文件条目和目录条目,目录条目的Name属性为空,需要单独处理创建目录
  • 解压前先确保目标文件的父目录存在,避免写入文件时报错

功能测试

我们可以编写一个简单的测试方法验证上述功能是否正常:

class Program
{
    static void Main(string[] args)
    {
        string testSourceDir = @"D:\TestSourceDir"; // 测试源文件夹,需要提前创建并放入一些文件
        string testZipPath = @"D:\TestCompressed.zip"; // 生成的压缩包路径
        string testTargetDir = @"D:\TestDecompressedDir"; // 解压目标路径

        try
        {
            // 测试压缩
            CompressDirectory(testSourceDir, testZipPath);
            // 测试解压
            DecompressDirectory(testZipPath, testTargetDir);
            Console.WriteLine("测试完成,功能正常");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"操作失败,错误信息:{ex.Message}");
        }
    }
}

注意事项

  • 操作文件时需要确保程序对源文件夹、目标路径有足够的读写权限,否则会抛出UnauthorizedAccessException异常
  • 如果压缩的文件夹中包含超大文件,建议分块处理或者添加进度提示,避免界面卡死
  • 处理用户输入的路径时,需要做好合法性校验,避免路径注入等安全问题

C#文件夹压缩文件夹解压ZipArchiveSystem.IO.Compression修改时间:2026-05-29 03:57:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。