You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.7.2环境下解压zip并覆盖原有文件的解决方案求助

适配.NET Framework 4.7.2的带覆盖功能Zip解压实现

.NET Framework 4.7.2原生的ZipFile.ExtractToDirectory未提供覆盖参数重载,我们可以通过手动遍历ZipArchive条目实现相同效果,无需引入第三方库。

前置要求

  • 项目需要添加对System.IO.Compression.FileSystem程序集的引用

实现代码

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

public static void ExtractToDirectoryOverwrite(string sourceZipPath, string targetDirectoryPath)
{
    // 确保目标根目录存在
    if (!Directory.Exists(targetDirectoryPath))
    {
        Directory.CreateDirectory(targetDirectoryPath);
    }

    // 打开压缩包,如需适配GBK等编码可替换为ZipFile.Open(sourceZipPath, ZipArchiveMode.Read, Encoding.GetEncoding("GBK"))
    using (ZipArchive archive = ZipFile.OpenRead(sourceZipPath))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            // 拼接目标文件/目录的完整路径
            string destinationPath = Path.GetFullPath(Path.Combine(targetDirectoryPath, entry.FullName));
            
            // 防止路径穿越风险(可选但建议保留)
            if (!destinationPath.StartsWith(Path.GetFullPath(targetDirectoryPath) + Path.DirectorySeparatorChar))
            {
                throw new IOException("压缩包包含非法条目,存在路径穿越风险");
            }

            // 处理目录类条目
            if (entry.FullName.EndsWith("/") || entry.FullName.EndsWith("\\"))
            {
                Directory.CreateDirectory(destinationPath);
                continue;
            }

            // 处理文件类条目:先创建文件所在目录,再解压覆盖
            Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
            entry.ExtractToFile(destinationPath, overwrite: true);
        }
    }
}

使用示例

// 调用自定义方法即可实现带覆盖的解压,参数和原生方法一致
ExtractToDirectoryOverwrite(ExtractSource, ExtractDestination);

内容的提问来源于stack exchange,提问作者lavamol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 09:09:03