在c#中,使用windows自带功能将文件夹打包为ZIP

在 C# 中,可以使用内置的 System.IO.Compression 命名空间轻松地将整个文件夹打包为 ZIP 文件。最直接的方法是使用 ZipFile.CreateFromDirectory 方法。

基本用法

csharp 复制代码
using System.IO.Compression;

string sourceFolder = @"C:\SourceFolder";      // 要压缩的文件夹
string zipFile = @"C:\Archive.zip";            // 生成的 ZIP 文件路径

ZipFile.CreateFromDirectory(sourceFolder, zipFile);

该方法会将 sourceFolder 中的所有文件和子文件夹递归地添加到 ZIP 文件中。

高级选项

CreateFromDirectory 有多个重载,允许你控制压缩行为:

csharp 复制代码
// 带 CompressionLevel 和 includeBaseDirectory 参数的重载
ZipFile.CreateFromDirectory(
    sourceFolder,
    zipFile,
    CompressionLevel.Optimal,   // 压缩级别(Optimal, Fastest, NoCompression)
    true                        // 是否在 ZIP 中包含源目录本身作为根目录
);
  • includeBaseDirectory:如果为 true,则 ZIP 文件中会包含源文件夹本身作为根目录(即解压后会出现一个与源文件夹同名的文件夹);如果为 false,则源文件夹下的所有内容直接位于 ZIP 根目录。
  • 还可以使用 EntryNameEncoding 参数指定文件名编码,或通过 Overwrite 参数控制是否覆盖已存在的 ZIP 文件(在 .NET 6+ 中)。

异常处理

注意捕获可能的异常,例如:

  • DirectoryNotFoundException:源文件夹不存在。
  • IOException:目标 ZIP 文件已存在且被占用等。
  • UnauthorizedAccessException:无权限访问文件。

添加对命名空间的引用

  • .NET Framework 4.5+ :需要添加对 System.IO.Compression.FileSystem 的程序集引用。
  • .NET Core / .NET 5+ :直接使用 System.IO.Compression 命名空间即可(通常已默认包含)。

完整示例

csharp 复制代码
using System;
using System.IO;
using System.IO.Compression;

class Program
{
    static void Main()
    {
        string folderPath = @"C:\MyFolder";
        string zipPath = @"C:\MyFolder.zip";

        try
        {
            // 检查源文件夹是否存在
            if (!Directory.Exists(folderPath))
            {
                Console.WriteLine("源文件夹不存在。");
                return;
            }

            // 如果目标 ZIP 文件已存在,可选择删除或覆盖
            if (File.Exists(zipPath))
            {
                File.Delete(zipPath);   // 或者使用 Overwrite 参数(.NET 6+)
            }

            // 创建 ZIP 文件,不包含基目录
            ZipFile.CreateFromDirectory(folderPath, zipPath, CompressionLevel.Optimal, false);

            Console.WriteLine($"文件夹已成功打包为:{zipPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"出错:{ex.Message}");
        }
    }
}

其他注意事项

  • 如果需要在压缩过程中过滤文件、处理大文件或显示进度,建议使用第三方库,如 SharpCompressDotNetZip(注意许可证)。
  • ASP.NET 应用中,可能需要使用异步方式,可以考虑将 CreateFromDirectory 包装在 Task.Run 中,或使用 .NET 6+ 提供的异步版本(如 ZipFile.CreateFromDirectoryAsync)。

使用内置的 ZipFile 类足以满足大多数简单到中等复杂度的文件夹打包需求。

相关推荐
盘古工具10 分钟前
告别重复劳动:Word 重复上一次操作的两种方法
windows·word
不光头强19 分钟前
Java中的异常
java·开发语言
Coding茶水间21 分钟前
基于深度学习的管道缺陷检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·机器学习
shamalee22 分钟前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
listhi52026 分钟前
基于MATLAB的汽车电动助力转向系统(EPS)转向特性分析
开发语言·matlab·汽车
C++chaofan33 分钟前
JUC 并发编程:对可见性、有序性与 volatile的理解
java·开发语言·spring·java-ee·juc·synchronized·
山上三树36 分钟前
常用程度整理 Windows 命令提示符(cmd)常用指令,包含命令 + 功能 + 示例,方便直接复制使用
windows
csbysj202036 分钟前
Django ORM - 单表实例
开发语言
XiYang-DING37 分钟前
【Java SE】双亲委派模型
java·开发语言
阿阿阿阿里郎40 分钟前
ROS2快速入门--C++基础
开发语言·c++·算法