Loading

02 C# 文件压缩与解压

一、使用System.IO.Compression.ZipFile进行文件压缩与解压

System.IO.Compression 命名空间包含以下类型来对文件和流进行压缩或解压缩。 还可以使用这些类型来读取和修改压缩文件的内容。System.IO.Compression.ZipFile可以使用NuGet下载安装。主要包含以下函数:

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

public static void CreateFromDirectory (string sourceDirectoryName, string destinationArchiveFileName);

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

public static void ExtractToDirectory (string sourceArchiveFileName, string destinationDirectoryName);

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

public static System.IO.Compression.ZipArchive Open (string archiveFileName, System.IO.Compression.ZipArchiveMode mode);

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

public static System.IO.Compression.ZipArchive OpenRead (string archiveFileName);

使用中,发现当解压文件夹所在目录中包含与待解压文件中重复的文件时会报错。此时,可以先遍历待解压文件,删除解压文件夹所在目录中的重复文件,然后再解压,具体如下:

    /// <summary>
    /// ZipFile: https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile.extracttodirectory?view=net-5.0
    /// 压缩与解压: https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-compress-and-extract-files
    /// </summary>
    public static class ZipFile
    {
        /// <summary>
        /// 创建压缩文件
        /// </summary>
        /// <param name="startPath"></param>
        /// <param name="zipPath"></param>
        public static void CreateFromDirectory(string startPath, string zipPath)
        {
            System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
        }

        /// <summary>
        /// 解压ZIP文件
        /// </summary>
        /// <param name="zipPath">压缩文件路径</param>
        /// <param name="extractPath">解压文件夹路径</param>
        /// <returns>返回文件个数</returns>
        public static int ExtractToDirectory(string zipPath, string extractPath)
        {
            int fileCount = 0;
            using (var archive = System.IO.Compression.ZipFile.OpenRead(zipPath))
            {
                fileCount = archive.Entries.Count;
                foreach (var entry in archive.Entries)
                {
                    string filePath = $"{extractPath}\\{entry.FullName}";
                    if (File.Exists(filePath))
                    {
                        File.Delete(filePath);
                    }
                }
            }

            System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
            return fileCount;
        }
    }
posted @ 2021-05-26 23:28  Dwaynerbing  阅读(679)  评论(0编辑  收藏  举报