博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# 压缩和解压缩文件 (System.IO.Compression.ZipFile)

Posted on 2024-07-01 11:06  火冰·瓶  阅读(124)  评论(0编辑  收藏  举报

参考文档:

https://learn.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile?view=net-8.0&redirectedfrom=MSDN

https://blog.csdn.net/lvmingzhou/article/details/134161441

 

操作 zip 存档及其文件的方法分布在三个类中: ZipFile、 ZipArchive和 ZipArchiveEntry。

从目录Create zip 存档 ZipFile.CreateFromDirectory
将 zip 存档的内容提取到目录 ZipFile.ExtractToDirectory
将新文件添加到现有 zip 存档 ZipArchive.CreateEntry
检索 zip 存档中的文件 ZipArchive.GetEntry
检索 zip 存档中的所有文件 ZipArchive.Entries
打开 zip 存档中包含的单个文件的流 ZipArchiveEntry.Open
从 zip 存档中删除文件 ZipArchiveEntry.Delete

 

示例:

using System;
using System.IO.Compression;

class Program
{
    static void Main(string[] args)
    {
        string startPath = @".\start";
        string zipPath = @".\result.zip";
        string extractPath = @".\extract";

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);
    }
}

方法

CreateFromDirectory(String, Stream)

在包含指定目录中的文件和目录的指定流中创建 zip 存档。

CreateFromDirectory(String, Stream, CompressionLevel, Boolean)

在包含指定目录中的文件和目录的指定流中创建 zip 存档,使用指定的压缩级别,并选择性地包含基目录。

CreateFromDirectory(String, Stream, CompressionLevel, Boolean, Encoding)

在包含指定目录中的文件和目录的指定流中创建 zip 存档,对条目名称使用指定的压缩级别和字符编码,并选择性地包含基目录。

CreateFromDirectory(String, String)

创建 zip 存档,该存档包含指定目录的文件和目录。

CreateFromDirectory(String, String, CompressionLevel, Boolean)

创建 zip 存档,该存档包括指定目录的文件和目录,使用指定压缩级别,以及可以选择包含基目录。

CreateFromDirectory(String, String, CompressionLevel, Boolean, Encoding)

创建 zip 存档,该存档包括文件和指定目录的目录,使用指定压缩级别和条目名称的字符编码,以及可以选择包含基目录。

ExtractToDirectory(Stream, String)

从指定流中存储的 zip 存档中提取所有文件,并将其放置在文件系统上的指定目标目录中。

ExtractToDirectory(Stream, String, Boolean)

从指定流中存储的 zip 存档中提取所有文件,并将其置于文件系统上的指定目标目录中,并选择性地允许选择是否应覆盖目标目录中的文件。

ExtractToDirectory(Stream, String, Encoding)

从指定流中存储的 zip 存档中提取所有文件,并将其放在文件系统的指定目标目录中,并使用指定的字符编码作为条目名称。

ExtractToDirectory(Stream, String, Encoding, Boolean)

从指定流中存储的 zip 存档中提取所有文件,并将其放在文件系统上的指定目标目录中,对条目名称使用指定的字符编码,并选择性地允许选择是否应覆盖目标目录中的文件。

ExtractToDirectory(String, String)

将指定 zip 存档中的所有文件都解压缩到文件系统的一个目录下。

ExtractToDirectory(String, String, Boolean)

将指定存档中的所有文件都解压缩到文件系统的某目录下。

ExtractToDirectory(String, String, Encoding)

将指定 zip 存档中的所有文件解压缩到文件系统的一目录下,并使用项名称的指定字符编码。

ExtractToDirectory(String, String, Encoding, Boolean)

将指定存档中的所有文件都解压缩到文件系统的某目录下。

Open(String, ZipArchiveMode)

以指定的模式打开指定路径上的 zip 归档。

Open(String, ZipArchiveMode, Encoding)

在指定的模式中用指定的项名称汉字解码打开指定路径的 zip 存档。

OpenRead(String)

打开在指定路径用于读取的 zip 存档。

 

 

自己的例子:

    public  class ZipHelper
    {



        /// <summary>
        /// ZIP解压文件
        /// </summary>
        /// <param name="zipFilePath">zip文件路径</param>
        /// <param name="extractPath">解压后保存文件的目录</param>
        public static void ExtractZipFile(string zipFilePath, string extractPath)
        {
            // 确保提取路径存在
            if (!Directory.Exists(extractPath))
            {
                Directory.CreateDirectory(extractPath);
            }
            

            using (var archive = ZipFile.OpenRead(zipFilePath))
            {
                foreach (var entry in archive.Entries)
                {
                    // 正确地处理文件夹结构
                    string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
                    //if (!destinationPath.StartsWith(extractPath, StringComparison.OrdinalIgnoreCase))
                    //{
                    //    throw new IOException("试图解压的文件超出了目标文件夹的路径边界。");
                    //}

                    if (entry.Name == "") // Entry是一个文件夹
                    {
                        Directory.CreateDirectory(destinationPath);
                    }
                    else // Entry 是一个文件
                    {
                        entry.ExtractToFile(destinationPath, overwrite: true);
                    }
                }
            }
        }
    }