在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 类足以满足大多数简单到中等复杂度的文件夹打包需求。

相关推荐
hnxaoli1 小时前
win10程序(十六)通达信参数清洗器
开发语言·python·小程序·股票·炒股
电饭叔2 小时前
文本为 “ok”、前景色为白色、背景色为红色,且点击后触发 processOK 回调函数的 tkinter 按钮
开发语言·python
Never_Satisfied3 小时前
在c#中,string.replace会替换所有满足条件的子字符串,如何只替换一次
开发语言·c#
Demon_Hao4 小时前
JAVA快速对接三方支付通道标准模版
java·开发语言
xyq20244 小时前
C# 判断语句详解与应用
开发语言
野犬寒鸦5 小时前
深入解析HashMap核心机制(底层数据结构及扩容机制详解剖析)
java·服务器·开发语言·数据库·后端·面试
观无5 小时前
visionpro的dll导入
c#
##学无止境##6 小时前
从0到1吃透Java负载均衡:原理与算法大揭秘
java·开发语言·负载均衡