.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
相关产品推荐
相关产品推荐

